写入NSData的NSUInteger(Objective-c)无法转换为整数(Java)

时间:2016-06-27 08:07:06

标签: java objective-c bytearray

我正在尝试读取用Objective-C编写的二进制文件:

u_int32_t test = 71508;

NSMutableData * outputData = [ [ NSData dataWithBytes:&test length:sizeof( u_int32_t ) ] mutableCopy ];

// Saves the data
...

// Then reading the value works fine
u_int32_t test;
[ self getBytes:&test length:sizeof( u_int32_t ) ];

然后我试图在Java中读取int:

// Read the file
...
Bytes ObjCBytes = byteArrayOutputStream.toByteArray( );
...

// Try to convert my Objective-C byte array to an int :
ByteBuffer buffer = ByteBuffer.allocate( 4 );
buffer.put( ObjCBytes );
buffer.flip( );
int ObjCInt = buffer.getInt( );

但我没有相同的结果!

所以,我决定在Java中做同样的事情:

ByteBuffer buffer = ByteBuffer.allocate( 4 );
buffer.putInt( 71508 );
bytes javaBytes = buffer.array( );

似乎两个字节数组是反转的:

ObjCBytes:{84,23,1,0}

javaBytes:{0,1,23,84}

无论整数值如何,行为都是相同的。

抱歉:我是新手...... 我相信原因是Java没有unsigned int?

我尝试了很多答案,但我没有找到解决方案。

如何将我的字节数组转换为整数而不管用于编写它的语言

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

据我所知,NSData默认使用little_endian字节顺序,而Java使用big_endian字节顺序。

More information on Wikipedia

我决定将我的NSData转换为big_endian,因此可以用Java读取:

NSUInteger    test = 71508;

// Java compatibility
u_int32_t bigEndianTest = CFSwapInt32BigToHost( test );

// Writes the value
NSMutableData * outputData = [ [ NSData dataWithBytes:&bigEndianTest length:saltSize ] mutableCopy ];

根据需要,反过来是可能的(Java => Little Endian => Objective-C)