Преобразование из байта [] в строку
-
19-09-2019 - |
Вопрос
У меня есть следующий код:
using (BinaryReader br = new BinaryReader(
File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite)))
{
int pos = 0;
int length = (int) br.BaseStream.Length;
while (pos < length)
{
b[pos] = br.ReadByte();
pos++;
}
pos = 0;
while (pos < length)
{
Console.WriteLine(Convert.ToString(b[pos]));
pos++;
}
}
File_path - это константная строка, которая содержит путь к чтению двоичного файла. Бинарный файл представляет собой смесь целых чисел и символов. Целые числа по 1 байта каждый, и каждый символ записывается в файл как 2 байта.
Например, файл имеет следующие данные:
1Hello, как дела, ты выглядишь великолепно // и так далее
Обратите внимание: каждое целое число связано со строкой символов, следующих за ним. Итак, 1 связан с «Привет, как дела» и 45 с «Вы отлично выглядите» и так далее.
Теперь бинар написан (я не знаю, почему, но я должен жить с этим) так, что «1» займет всего 1 байт, в то время как «H» (и другие персонажи) принимают по 2 байта каждый.
Итак, вот что на самом деле содержит файл:
0100480045 .. и так далее, сбой:
01 - первый байт для целого числа 1 0048 - это 2 байта для 'H' (H - 48 в HEX) 0045 - 2 байта для 'E' (e = 0x45)
И так далее .. Я хочу, чтобы моя консоль распечатала из этого файла в формате человека: что я хочу, чтобы он печатал «1 Привет, как дела», а затем «45 ты выглядишь великолепно» и так далее ...
То, что я делаю правильно? Есть ли легкий/эффективный способ? Моя линейная консоль.writeline (Convert.ToString (B [POS])); ничего не делает, кроме как печатает целочисленное значение, а не фактический характер, который я хочу. Это нормально для целых чисел в файле, но как мне читать символы?
Любая помощь приветствуется. Спасибо
Решение
Я думаю, что вы ищете Encoding.getString.
Поскольку ваши строковые данные состоит из 2 -байтовых символов, как вы можете вытащить свою строку:
for (int i = 0; i < b.Length; i++)
{
byte curByte = b[i];
// Assuming that the first byte of a 2-byte character sequence will be 0
if (curByte != 0)
{
// This is a 1 byte number
Console.WriteLine(Convert.ToString(curByte));
}
else
{
// This is a 2 byte character. Print it out.
Console.WriteLine(Encoding.Unicode.GetString(b, i, 2));
// We consumed the next character as well, no need to deal with it
// in the next round of the loop.
i++;
}
}
Другие советы
Вы можете использовать string System.text.unicodeencoding.getString (), который берет байт [] массив и создает строку.
Я нашел эту ссылку очень полезной
Обратите внимание, что это не то же самое, что просто слепо копирование байтов из байта [] массива в кусок памяти и называть его строкой. Метод getString () должен проверять, например, байты и запрещать неверные суррогаты.
using (BinaryReader br = new BinaryReader(File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite)))
{
int length = (int)br.BaseStream.Length;
byte[] buffer = new byte[length * 2];
int bufferPosition = 0;
while (pos < length)
{
byte b = br.ReadByte();
if(b < 10)
{
buffer[bufferPosition] = 0;
buffer[bufferPosition + 1] = b + 0x30;
pos++;
}
else
{
buffer[bufferPosition] = b;
buffer[bufferPosition + 1] = br.ReadByte();
pos += 2;
}
bufferPosition += 2;
}
Console.WriteLine(System.Text.Encoding.Unicode.GetString(buffer, 0, bufferPosition));
}