将缓冲区转换为unsigned int并使用位掩码

时间:2016-11-08 11:29:38

标签: java objective-c byte nsdata

我有4个字节的数据(存储为unsigned int),我想使用它。

当这是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 个答案:

答案 0 :(得分:1)

要将4个字节转换为整数,您可以执行与1字节代码类似的操作,但必须处理字节序 - 您需要知道存储4个字节的哪个方向,低字节或高字节第一

首先使用4字节缓冲区:

maxOccurs="1"

复制字节:

uint32_t buffer; // or use int32_t if signed

并将字节顺序转换为主机顺序。如果数据是大端,请执行:

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

或者如果它的小端:

uint32_t payloadLength = CFSwapInt32BigToHost(buffer);

你已经完成了。