2016-11-08 62 views
1

我有4個字節的數據(存儲爲無符號整數),我想使用它。將緩衝區轉換爲無符號整型並使用位掩碼

當是這種數據的1個字節,這已被使用解決:

//Java 

buffer.get() & 0xFF 

//Objective-C 

uint32_t buffer; 
[data getBytes:&buffer range:NSMakeRange(2, 1)]; 
uint32_t payloadLength = buffer & 0xFFu; 
//data = d1021b53 
//buffer = 897307; payloadLength: 27 

在Java中,爲4個字節,這已被使用來完成:

//Java 

buffer.getInt() & 0xFFFFFFFFL 

//Current not working Objective-C code 
uint32_t buffer; 
[data getBytes:&buffer range:NSMakeRange(2, 4)]; 
uint32_t payloadLength = CFSwapInt32BigToHost(buffer); 
//data: 0103940f b7626361 
//buffer = 1656164244; payloadLength: 2484057954 (should be = ~80) 

對於Objective- C/C,我很難處理4個字節和位掩碼。

任何人有任何幫助嗎?

回答

1

要在4個字節轉換爲整數,你可以做你的1個字節碼類似的東西,但你必須處理尾序 - 這是你需要知道它周圍的4個字節的方式存儲,低或高字節在前。

因此,與4個字節的緩衝區開始:

uint32_t buffer; // or use int32_t if signed 

複製字節:

[data getBytes:&buffer range:NSMakeRange(0, 4)]; 

而字節的順序轉換爲主機順序。如果數據是大端做:

uint32_t payloadLength = CFSwapInt32BigToHost(buffer); 

,或者如果其小端:

uint32_t payloadLength = CFSwapInt32LittleToHost(buffer); 

和你做。

+0

我沒有使用這個喜悅。我已經改變了原來反映改變使用unsigned int(如它應該)的objective-c 1字節示例。 當我嘗試使用CFSwapInt32BigToHost(或Little)與4字節值時,結果是無法理解的。即使在上面的1字節示例中使用它也不起作用。 關於如何複製java 0xFFFFFFFF位掩碼的其他建議? –

+0

在這種情況下,不需要使用位掩碼。你能編輯你的問題嗎(因爲把代碼放在註釋中並不真正起作用),根據這個答案顯示你現在的代碼,並且包含NSLog的結果(@「%@ \ n%8x \ n%8x 「,data,buffer,payloadLength)'? (如果數據很長,請刪除一些'data'的轉儲文件) – CRD

+0

我編輯了這篇文章以顯示示例值,並顯示它現在是什麼,哪些不起作用。 –

相關問題