Не могу прочитать Integer в потоке после кодирования его как UTF-8 вместо ASCII - PullRequest
1 голос
/ 09 октября 2010

У меня были проблемы с Umlauts в ASCII, поэтому я теперь кодирую свой поток как UTF-8, который работает, но это вызывает проблему.Обычно я читаю 4 байта перед ARTIST, чтобы определить длину ARTIST = WHOEVER, используя

UTF8Encoding enc = new UTF8Encoding();
string response = enc.GetString(message, 0, bytesRead);
int posArtist = response.IndexOf("ARTIST");
BitConverter.ToInt32(message, posArtist - 4);

. Это прекрасно работает для ASCII.

Примеры шестнадцатеричного редактора просто для иллюстрациичтение длины больше не работает, как в ASCII

Вот пример скриншота из hex-редактора: alt text

"ARTIST = MANDY vs. Booka Shade"Длина = 21

Однако это не работает для потока в кодировке UTF8.Вот скриншот: alt text

"ARTIST = Paulseq" Длина = E, но на картинке его 2E.

Что я здесь не так делаю?

Ответы [ 4 ]

4 голосов
/ 09 октября 2010

ваши данные неверны - у вас фактически есть символ '\ 0' в данных, где должны быть двоичные нули

Проблема заключается в том, как вы создали эти данные, а не в чтении их

3 голосов
/ 09 октября 2010

Я предполагаю, что вы смешиваете инструменты. Это бинарный поток. Его следует читать с помощью BinaryReader и писать с помощью BinaryWriter. При написании текста используйте Encoder.GetBytes для получения необработанных байтов для записи, а при чтении используйте Encoder.GetString для необработанных байтов. BinaryWriter / Reader имеет методы для значений (например, длины) напрямую.

3 голосов
/ 09 октября 2010

Совершенно загадочно, как вы получили 21 из данных ASCII. Затененный байт находится в шестнадцатеричном формате, его реальное значение равно 33. Вы не можете получить 21 из BitConverter.ToInt32, для которого требуются байтовые значения (в шестнадцатеричном формате) 15 00 00 00.

Должно быть, это сработало случайно, но понятия не имею, как может выглядеть эта авария. Отправьте больше кода, включая код, который пишет это.

2 голосов
/ 09 октября 2010

Только строки должны быть в кодировке / декодировании UTF-8. Если вы передаете другие (не строковые) значения в двоичном формате, кодировщики уничтожат их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...