2016-04-08 21 views
1

yapısına bir NSData dönüştürmek için: < 840100ec d5045715 00010014 00240018 00>ben cihazı (BLE) bir veri var doğru

ama ikinci bayt doğru dönüştüremiyor. Bu gibi:

enter image description here

Ama Uint8 dizisi kullanabilirsiniz yapabilir, neden? Teşekkür ederim. Bu gibi enter image description here

kodu: derleyici bellekte bir yapının bireysel alanlarını ortaya koyan Nasıl

// I got the data:<840100ec d5045715 00010014 00240018 00> 

    case SPK_FEEDBACK_HistoryDataPort: 
    // Log 
    NSLog(@"receive data:%@", [NSData dataWithBytes:originalCommandBytes length:sizeof(D2MHistoryDataPort)]); 

    // originalCommandBytes dataType:UInt8 * 
    D2MHistoryDataPort *historyData = (D2MHistoryDataPort *)originalCommandBytes; 

    // Log 
    NSLog(@"收到硬件返回的0x%x指令(历史数据体): 历史数据包的索引:%d; 时间戳:%d; 步数:%d; 卡路里:%d; 距离:%d; 睡眠:%d; 运动时长:%d", 
      historyData->cmd, 
      historyData->index, 
      (unsigned int)historyData->timeStamp, 
      historyData->steps, 
      historyData->calories, 
      historyData->distance, 
      historyData->sleep, 
      historyData->duration); 
    break; 

    // I declare this struct in another class 
    typedef struct { 
     UInt8 cmd; 
     UInt16 index; 
     UInt32 timeStamp; 
     UInt16 steps;// 步数 
     UInt16 calories;// 卡路里 
     UInt16 distance;// 距离,单位m 
     UInt16 sleep;// 睡眠 
     UInt16 duration;// 运动时长,单位minute 
    } D2MHistoryDataPort; 
+0

Ne sorduğun belli değil. NsData'ya eriştiğiniz kodu gösterebilir misiniz? – Paulw11

+0

Freebck'iniz için teşekkürler, kodu güncelledim :) –

+0

Sorununuzun ne olduğu hala net değil. Beklenen çıktı nedir ve sahip olduklarınızdan nasıl farklıdır? – Paulw11

cevap

2

bağımlı uygulamasıdır. Genellikle derleyici, alanları düzgün bir şekilde hizalamak için dolgu eklemeli ve hatta gerekli dolguyu ve yapının genel boyutunu azaltmak için bunları (aynı boyuttaki alanları gruplayarak) yeniden sıralayabilir.

Sen __attribute__((packed)) kullanarak bu davranışı kapatabilirsiniz:

typedef struct __attribute__((packed)) { 
    UInt8 cmd; 
    UInt16 index; 
    UInt32 timeStamp; 
    UInt16 steps;// 步数 
    UInt16 calories;// 卡路里 
    UInt16 distance;// 距离,单位m 
    UInt16 sleep;// 睡眠 
    UInt16 duration;// 运动时长,单位minute 
} D2MHistoryDataPort; 
+0

Benim için çalış, çok teşekkürler. Ama ben 'struct' arkasındaki __ __ __ __ ((paket)) ** koydum. 'D2MHistoryDataPort'un arkasına koyarsam, uyarı:' paketlenmiş özellik göz ardı edilir '. Tekrar teşekkürler! –

+0

Rica ederim. Özniteliği doğru yere taşıdım. * Typedef * olmadan bir declaration'a karşı * typedef * için biraz farklıdır. Teşekkürler. – Codo

0

Ne yapıyorsun oldukça işe garantilidir. Bir yapıya girmeye çalışıyorsunuz, bunu bir bayt dizisi olarak yorumlayabileceğinizi, yazıp geri okuyabileceğinizi varsayalım. Bu işe yaramayacak. Derleyici sürümleri arasında 32 ve 64 bit derleyiciler arasında farklı düzenlere sahip yapılarla başlayarak. 90'lı yıllarda insanlar bunun kötü bir fikir olduğunu biliyorlardı.

NSCoding protokolünü kullanın. Veya verileri JSON'a dönüştürün. Yapıları bir bayt dizisi olarak yorumlamaya çalışmayın.

: 1. Adım: dış veri formatını tanımlayın kesinlikle NSData kullanmaktan kaçınmak yapamıyorsanız o güvenle nasıl çalıştığını

, bu. Dış veri formatı "derleyicim yapmamı düzenlemeye karar verdiyse" DEĞİLDİR. Dış veri formatı "Bir imzalanmamış bayt cmd; iki işaretsiz bayt endeksi, en önemli bayt ilk. 4 işaretsiz bayt zaman damgası, en önemli bayt ilk, yani 1 Ocak 1904'ten bu yana geçen saniye sayısı, ..." vb.

Sonra yeterli bayt olduğunu kontrol ilk byte bir gösterici olsun, yapı okumak ve benzeri

mystruct.cmd = p [0]; 
mystruct.index = (p [1] << 8) | p [2]; 
mystruct.timeStamp = (p [3] << 24) | (p [4] << 16) ... 

ve yazmak için.

İlgili konular