![](/img/trans.png)
[英]passing (pointer to UInt8 array) and accessing the array in Objective-C
[英]How Convert Byte Array To UInt64 In Objective-C
到目前為止,我已經完成了將收到的8個字節轉換為UInt64的工作:
+ (UInt64)convertByteArrayToUInt64:(unsigned char *)bytes ofLength:(NSInteger)length
{
UInt64 data = 0;
for (int i = 0; i < length; i++)
{
data = data | ((UInt64) (bytes[i] & 0xff) << (24 - i * 8));
}
return data;
}
將數據轉換為8字節數據的發送方就是這樣做的:
for(int i=1;i<9;i++)
{
statusdata[i] = (time >> 8*i & 0xff);
}
我收到的8字節數據是:
01 00 00 00 00 00 00 3b
我的方法的輸出是:
16777216
我嘗試使用計算器將此“16777216”轉換為字節,我得到:
01 00 00 00 00 00 00
這意味着3b不包括在轉換中。
但是,我在java下嘗試了這個代碼並且工作正常。 我不知道問題出在哪里。
請幫忙。 提前致謝!
UInt64
是8個字節,所以如果你有一個8字節的緩沖區,你需要做的就是創建一個UInt64
指針並取消引用它(只要數據在x86體系結構上是小端格式,但我會得到在一秒鍾內,
所以:
unsigned char foo[8] = {0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01};
UInt64 *n = (UInt64 *) foo; // pointer to value 0x0102030405060708
UInt64 nValue = *n;
請注意,雖然x86硬件上的單個字節值是little-endian,但最低有效字節在緩沖區中排在第一位 。 因此,如果您將上面的緩沖區視為單個基數為16位數,則數字將為:
0x0102030405060708(最高有效字節在緩沖區中為最后一個)。
您正在尋找的技巧是簡單地將您的8字節緩沖區轉換為UInt64*
並取消引用它。 如果您在我推薦之前從未見過大與小端存儲/字節順序,請閱讀相關內容。
ps - 發送者代碼是錯誤的btw,數組索引( i
)需要從0運行到7,所以(i=0;i<8;++i)
, 而不是 1-8或time
的值不會是正確復制。 順便說一句,發件人試圖復制time
到statusdata
(在緩沖區第一最小顯著字節)在little-endian順序,但再次,它是被做了錯事。
此外,如果發件人代碼在Java上,您需要注意time
值實際上不應該是負數。 Java沒有無符號整數值,因此如果time
是負數並且您將其重新組合為UInt64,那么它將是一個很大的正值,這不是您想要的。
為了完整起見,我將向您展示如何從little-endian緩沖區逐字節重構數據,但請記住,發送方代碼是錯誤的,需要重寫為從零開始索引(和類型轉換為如上所示也會讓你到那里):
data = 0
for (i=0; i < 8; ++i) {
data = (data << 8) | bytes[i]; // bytes is already UInt8 * so no need to mask it
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.