2016-07-21 9 views
1

私はBluetooth Low Energyのデバイスと通信するアプリケーションを作成しました。 私のアプリとこのデバイスは、基本的に独自のメッセージ構文を持っています。彼らはバイトとしてデータを交換し、データの各値は逆になります。Swift NSData getBytesが逆転しました

私の問題は、値を元に戻した後、3バイトの値をInt32に変換すると、NSData.getBytes関数が値を逆転しているように見えるため、間違った値になります。例:

var value; // containing [ 0x01, 0xD3, 0x00 ] 
value = value.reverse(); // Reverse back : [ 0x00, 0xD3, 0x01 ] 
let numb = value.getUInt32(); // Numb will be 119552, instead of 54017... 

私は私の問題ではっきりしているかどうかはわかりませんが、ここに私のコードです。データを逆にしてデータをintに変換しようとする関数。

// Those functions are in an extension of NSData 
func getRUInt32(range:NSRange) -> UInt32 
{ 
    var data = message.subdataWithRange(range); // Extract data from main message 
    data = data.reverse(); // Reverse back data 
    return data.getUInt32(); // Convert to UInt32 
} 

func getUInt32() -> UInt32 
{ 
    var value:Int32 = 0; 
    getBytes(&value, length: self.length); 
    return UInt32(value); 
} 

func reverse() -> NSData 
{ 
    let count:Int = length/sizeof(UInt8); 
    var array = [UInt8](count: count, repeatedValue: 0); 
    getBytes(&array, length: count * sizeof(UInt8)); 

    var reversedArray = [UInt8](count: count, repeatedValue: 0); 
    for index in 0..<array.count 
    { 
     reversedArray[index] = array[array.count - index - 1]; 
    } 

    return NSData(bytes: reversedArray, length: reversedArray.count); 
} 
+0

私はあなたの 'getUInt32'を取得しません、なぜ' UInt32'の代わりに 'Int32'としてローカル値を定義しますか?また、 'Int'型にある' .bigEndian'と '.littleEndian'を探しているだけでしょうか? – hnh

+0

UInt32を持つgetBytesに問題があるようです。私はいくつかの間違った値を見てきました。このように変換するので、問題は起こっていません。しかし、多分私は間違っています。これが私がここにいる理由です。私はそれが正しく動作するようにします:( – Kyu

答えて

1

あなたはバイト順ユーティリティを見ている必要がありますが参照します。

https://developer.apple.com/library/ios/documentation/CoreFoundation/Reference/CFByteOrderUtils/index.html#//apple_ref/c/func/CFConvertDoubleHostToSwapped

あなたは CFByteOrderGetCurrent機能を使用して、現在のプラットフォームのネイティブ形式を識別します。 CFSwapInt32BigToHostおよびCFConvertFloat32HostToSwappedなどの関数を使用して、異なるバイトオーダー形式の間で の値を変換します。

関連する問題