2012-03-22 6 views
7

У меня есть байт, который представляет собой массив из 30 байт, но когда я использую BitConverter.ToString, он отображает шестую строку. Байт 0x42007200650061006B0069006E00670041007700650073006F006D0065. Это также в Юникоде.Как преобразовать массив байтов в строку?

Это означает B.r.e.a.k.i.n.g.A.w.e.s..m.e, но я не уверен, как заставить его преобразовать из шестнадцатеричного кода в Unicode в ASCII.

ответ

14

Вы можете использовать один из классов Encoding - вам нужно знать, что такое кодировка этих байтов.

string val = Encoding.UTF8.GetString(myByteArray); 

Значения, проявившие выглядят как кодировку Unicode, так UTF8 или Unicode выглядеть как хорошие ставки.

+0

большое вам спасибо! хаха это сработало. –

+3

@IanLundberg: Обратите внимание: если вы используете 'Encoding.UTF8', вы получите строку, которая в два раза длиннее, чем должна быть для ваших входных данных. В некоторых выходных формах вы можете не видеть *, но каждый другой символ будет U + 0000. –

+0

О, ладно, я не понимал, что –

4

Похоже, что это прямой порядок байтов UTF-16, так что вы хотите Encoding.Unicode:

string text = Encoding.Unicode.GetString(bytes); 

Вы не должны, как правило предположить, что кодировка, хотя - это должно быть что-то вы знаете о данных , Для других кодировок вы, очевидно, используете разные экземпляры Encoding, но Encoding - это правильный класс для двоичных представлений текста.

EDIT: Как было отмечено в комментариях, вы, кажется, отсутствует знак «00» или от начала вашего массива байтов (в этом случае вам нужно Encoding.BigEndianUnicode) или от конца (в этом случае просто Encoding.Unicode Это хорошо).

(Когда речь заходит об обратном, однако, принимая произвольные двоичные данные и представляя их как текст, вы должны использовать hex или base64. Это не тот случай, но вы должны знать об этом.)

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