2016-11-08 37 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

我编辑了这篇文章以显示示例值,并显示它现在是什么,哪些不起作用。 –

相关问题