簡體   English   中英

如何在Objective-C中將字節數組轉換為UInt64

[英]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的值不會是正確復制。 順便說一句,發件人試圖復制timestatusdata (在緩沖區第一最小顯著字節)在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM