2016-05-20 4 views
0

У меня есть строка, которую я пытаюсь преобразовать в байты, чтобы создать хеш-память md5 как в ObjC, так и в Java. По некоторым причинам байты различаются между двумя языками.Извлечение байтов строки возвращает разные результаты в ObjC, чем Java

Java

System.out.println(Arrays.toString(
("78b4a02fa139a2944f17b4edc22fb175:8907f3c4861140ad84e20c8e987eeae6").getBytes())); 

Выход:

[55, 56, 98, 52, 97, 48, 50, 102, 97, 49, 51, 57, 97, 50, 57, 52, 52, 102, 49, 55, 98, 52, 101, 100, 99, 50, 50, 102, 98, 49, 55, 53, 58, 56, 57, 48, 55, 102, 51, 99, 52, 56, 54, 49, 49, 52, 48, 97, 100, 56, 52, 101, 50, 48, 99, 56, 101, 57, 56, 55, 101, 101, 97, 101, 54] 

ObjC

NSString *str = @"78b4a02fa139a2944f17b4edc22fb175:8907f3c4861140ad84e20c8e987eeae6"; 
NSData *bytes = [str dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:NO]; 
NSLog(@"%@", [bytes description]); 

Выход:

<37386234 61303266 61313339 61323934 34663137 62346564 63323266 62313735 3a383930 37663363 34383631 31343061 64383465 32306338 65393837 65656165 36> 

Я пробовал использовать разные кодировки без везения и не могу думать о каких-либо других причинах, по которым байты будут разными. Есть идеи? Я заметил, что все байтовые значения различаются в 18 раз, но я не уверен, что вызывает его.

ответ

1

На самом деле, Java печатает в десятичной форме, байт по байт. Obj C печатает в шестнадцатеричном виде, целое число целым числом.

chart Ссылаясь это:

Dec Hex 
55 37 
56 38 
98 62 
... 

Вы просто должны найти способ вывода побайтно в Obj C.

Я не знаю о Obj C, но если что NSLog функция работает аналогично printf() в C, я бы начал с этого.

+0

Я знал, что это должно быть что-то в этом роде. Поэтому, когда я создаю хэш-файл md5, вы говорите, что оба они должны быть созданы из десятичного или шестнадцатеричного значения и не должны отличаться между двумя языками? – Geoff

+0

Я не могу сказать об ObjC, но функция Java 'Arrays.toString()' работает, преобразовывая последовательность байтов в десятичные числа и печатая массив из них. Какой из двух выходов предназначен для вас? Измените другое в соответствии с этим. – cst1992

0

Фрагмент кода из Apple

unsigned char aBuffer[20]; 
NSString *myString = @"Test string."; 
const char *utfString = [myString UTF8String]; 
NSData *myData = [NSData dataWithBytes: utfString length: strlen(utfString)]; 

[myData getBytes:aBuffer length:20]; 

Изменение в байтах может быть связано с представлением Hex. В приведенном выше коде показано, как преобразовать строку в байты и сохранить результат в буфере.

+0

И это отвечает на вопрос, каким образом? Пожалуйста, добавьте некоторое объяснение, а не просто отправьте код. Я не вижу, что это имеет какое-то отношение к тому, что задал ОП. –

+0

Я не знаю, что неясно в фрагменте кода. Он ясно показывает правильный способ преобразования строки в байты –

+0

Тогда, возможно, это просто потому, что я не знаю ObjC. Простите за это. Тем не менее, ваше добавленное объяснение упрощает понимание того, что делает код. –

Смежные вопросы