2014-11-24 2 views
4

Не могли бы вы помочь обнаружить ошибку? Вот код:Байт для преобразования строк в байт puzzling error

byte[] oriBytes = { 0xB0, 0x2D };      // oriBytes -> 0xB0, 0x2D 
    string oriInStr = Encoding.ASCII.GetString(oriBytes); // oriInStr -> "?-" 
    oriBytes = Encoding.ASCII.GetBytes(oriInStr);   // oriBytes -> 0x3F, 0x2D 

я не могу получить обратно исходные значения байтов 0xB0, 0x2D.

+1

Почему вы декодируете с помощью ASCII? Ваш вход ограничен ASCII? –

+0

Используйте 'Encoding.Default', это реализует кодовую страницу, используемую в вашей ОС. – leppie

+0

Я только что решил. просто используйте Encoding.Unicode вместо ASCII. Я работаю с каждым битом байта для своего электронного оборудования, ARM и PIC. –

ответ

8

0xB0 не является действительным кодом ASCII. Вы можете прочитать here:

Любой байт больше, чем шестнадцатеричное 0x7F декодируется как Unicode знак вопроса ("?")

1

В вас байт [] 0xB0 изменения в 176 и 0x2D изменение 45. Когда вы конвертируете из ASCII, который имеет только 128 символов 176, вы получите? (неопределенный) и 45 дает вам -.

Попробуйте отладить код и посмотреть, что происходит.

4

Это связано с появлением .NET doesn't supportExtended ASCII table. Каждое значение выше 127 будет производить ?, что составляет 63.

Следовательно, преобразование ? назад приведет к 63.

При выполнении кода с кодировкой UTF8, вы увидите, что он идет к расширенной странице, так как newBytes в этом примере возвращает 4 байт, а не 2:

byte[] oriBytes = { 0xB0, 0x2D }; 
string oriInStr = Encoding.UTF8.GetString(oriBytes); 
byte[] newBytes = Encoding.UTF8.GetBytes(oriInStr); 
0

ahaah .. Я получил его! используйте Encoding.Unicode вместо ASCII. Опасайтесь парней ...;)

byte[] oriBytes = { 0xB0, 0x2D };       // oriBytes -> 0xB0, 0x2D 
    string oriInStr = Encoding.Unicode.GetString(oriBytes); // oriInStr -> "?-" 
    oriBytes = Encoding.Unicode.GetBytes(oriInStr);   // oriBytes -> 0xB0, 0x2D 
+0

это работает да, если вы не хотите, чтобы строка была представлена ​​в ascii. – Vajura

+0

Я тестировал его с очень длинной строкой (текстом), фактически копируя половину страницы. Преобразуйте его в массив байтов, затем вернитесь к строке. Я могу получить исходный текст ... Просто следите за этой простой ошибкой. Это может привести к сильной головной боли, по крайней мере для меня ...;) –

0

Как уже упоминалось, Net не поддерживает расширенный ascii. Чтобы решить эту проблему, вы должны указать значения байтов на char, который является существенным int, и будет правильно отображать их.

byte[] oriBytes = { 0xB0, 0x2D };      
string oriInStr = ""; 
for (int a = 0; a < oriBytes.Length; a++) 
    oriInStr += (char)(oriBytes[a]); 
oriBytes = Encoding.ASCII.GetBytes(oriInStr); 
+0

Вы протестировали свой код? Это дает те же самые результаты! 0x3F, 0x2D –

+0

Я сделал да, как вы распечатываете его? – Vajura

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