Преобразование строк, содержащих непечатаемые символы - PullRequest
5 голосов
/ 04 ноября 2011

Я хотел бы преобразовать байтовый массив, содержащий непечатаемые символы, в строку для моего приложения. Когда я преобразовываю обратно в байтовый массив, содержимое массива должно оставаться таким же, как я обнаружил, что ASCII / Unicode / UTF8 не всегда дает мне правильное решение?

* 1003 например *

 byte[] bytearray ={ 147, 35, 44, 18, 255, 104, 206, 72 ,69};

 string str = System.Text.Encoding.ASCII.GetString(bytearray);

 bytearray = System.Text.Encoding.ASCII.GetBytes(str);

В приведенном выше примере я обнаружил, что байтовый массив содержит

{ 63, 35, 44, 18, 63, 104, 63, 72 ,69}.

Пожалуйста, помогите мне.

Ответы [ 4 ]

8 голосов
/ 04 ноября 2011

Взгляните на метод Convert.ToBase64String .Он преобразует байтовый массив в строку.Помните, что при кодировании в строку данные будут занимать больше места, чем ваш оригинальный байтовый массив.

public static string ToBase64String(
    byte[] inArray
)

Затем можно декодировать строку обратно в байтовый массив, используя FromBase64String

public static byte[] FromBase64String(
    string s
)
1 голос
/ 04 ноября 2011

Я думаю, что ваша проблема в том, что вы используете неправильную кодировку. ASCII определяет 128 символов (http://en.wikipedia.org/wiki/ASCII) и поэтому никогда не даст вам байтов больше 128.

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

Кажется, я неправильно понял вопрос. Мой ответ был уместен только в том случае, если байтовый массив представлял собой закодированную строку - я не читал бит, в котором говорилось, что это непечатаемые символы и т. Д. Ответ Никола - тот, к которому нужно обратиться :)

0 голосов
/ 04 ноября 2011

Если вы используете кодировку ASCI для преобразования вашего байтового массива в строку, помните, что ASCI - это 7-битный протокол, кодировка либо обнуляет восьмой бит, либо возвращается к определенному значению (документация кажется неясной, что это делает!)

Цитировать MSDN;

До .NET Framework версии 2.0, .NET Framework допускала подмена, игнорируя 8-й бит. Начиная с .NET Framework 2.0, кодовые точки не ASCII отступают во время декодирования.

0 голосов
/ 04 ноября 2011

Использовать другую базу кодировки, поскольку ASCII изменит все непечатаемые символы на? будучи 63.

Если строка не обязательно должна быть удобочитаемой версией не пронаблюдаемых символов, действительно преобразование ее в base64 (UUEncode / XXEncode) действительно поможет.

...