2016-06-27 3 views
0

Я пытаюсь прочитать бинарный файл, написанный в Objective-C, как это:NSUInteger написано в NSData (Objective-C) не может быть преобразован в виде целого числа (Java)

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) ]; 

Тогда я пытаюсь читать int в Java:

// 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}

поведение одно и то же, независимо о f - целочисленное значение.

Извините: я новичок ... Я считаю, что причина в том, что Java не имеет unsigned int?

Я пробовал много ответов, но я не нашел решение.

Как преобразовать массив байтов в целое число независимо от языка, используемого для его записи?

Большое спасибо за помощь.

+0

Вы можете просто изменить массив байтов на одной или другой стороне. – Avi

+0

@Avi, да, если я считаю, что массив байтов был написан, если Objective-C. Я не хочу этого делать. – Christophe

+0

Переверните его на стороне ObjC. Если вам также нужно прочитать его обратно в ObjC, вы поймете, что оно было отменено, поэтому вы снова его отмените. – Avi

ответ

0

Как я понимаю, NSData использует байтовый порядок little_endian по умолчанию, в то время как Java использует байтовый порядок байтов.

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)