我正在尝试读取用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?
我尝试了很多答案,但我没有找到解决方案。
如何将我的字节数组转换为整数而不管用于编写它的语言?
非常感谢你的帮助。
答案 0 :(得分:0)
据我所知,NSData默认使用little_endian字节顺序,而Java使用big_endian字节顺序。
我决定将我的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)