C # - Чтение байтов, что они и что происходит. Я ожидаю двоичные значения, а не десятичные числа - PullRequest
3 голосов
/ 14 марта 2011

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

В приведенном ниже коде я читаю текстовый файл, который содержит только слова "привет там".

        FileStream fileStream = new FileStream(@"C:\myfile.txt", FileMode.Open);

        byte[] mybyte = new byte[fileStream.Length];

        fileStream.Read(mybyte, 0, (int)fileStream.Length);

        foreach(byte b in mybyte)
            Console.Write(b);

        Console.ReadLine();

В этом случае переменная mybyte содержит числовые значения, которые представляют десятичный аналог ASCII. Тем не менее, я байт представляет биты, которые, в свою очередь, представляют двоичные значения. При чтении байта я ожидаю увидеть двоичное значение, например «0001010», а не «104», которое является символом ascii для «h».

В случае чтения изображения, при чтении изображения в байтовый массив я снова вижу числа в массиве, а из низкоуровневого восприятия я бы ожидал двоичные значения. Я знаю, что эти числа, очевидно, не отображаются в Ascii, но я запутался, почему при чтении строки они сопоставляются с числами Ascii, а при чтении потока изображения происходит что-то еще (на самом деле я не уверен, что представляют собой числа в случае чтения изображения).

Я знаю, что значение чисел в байтовом массиве не критично, но меня это очень интересует.

Может ли кто-нибудь пролить свет на байты в .net framework при чтении из текстового файла и при чтении двоичного файла (т.е. изображения). Спасибо

Это изображение является байтовым массивом, содержащим текст "hi there", прочитанный из myfile.txt Byte array of the myfile.txt file.  Values map to Это изображение является байтовым массивом, содержащим поток изображения enter image description here

Ответы [ 4 ]

3 голосов
/ 14 марта 2011

01101000 - это 8-битное представление значения 104. Поскольку байт ac # хранит 8 бит (0-255), он показывается вам как нечто более читаемое.Откройте калькулятор Windows и измените представление на «Programmer», затем установите его на «Bin».Может немного прояснить ситуацию.

Он не показывает десятичное число, он показывает ac # байт, число от 0 до 255

0 голосов
/ 14 марта 2011

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

Например, когда вы читаете байт из файлового потока, а затем анализируете его с помощью кодировки, например:

FileStream fs = new FileStream(@"<Filename>", FileMode.Open, FileAccess.Read, FileShare.Read);
            byte[] bt = new byte[8];
            fs.Read(bt , 0, 1);
            string str = System.Text.ASCIIEncoding.ASCII.GetString(bt);

Вы получите символ ASCII, даже если вы читаете из файла изображения. Если вы передаете один и тот же поток файлов изображений в класс Image, такой как

Bitmap bmp = (Bitmap)Image.FromFile(@"<Filename>");

и назначьте этот bmp для графического окна, вы увидите изображение.

Резюме: Ваши переводчики придают значение вашим 0 и 1 или вашим десятичным числам. Сами по себе они ничего не значат.

0 голосов
/ 14 марта 2011

Байт состоит из 8 бит. Они могут быть записаны по-разному, например, как десятичное значение (104), как двоичные значения (1101000) или как шестнадцатеричное значение (68). Все они означают одно и то же, это просто разные представления ценностей.

Это не имеет ничего общего с ASCII-символами. Они тоже бывают длиной в один байт (если быть точным, 7 бит).

0 голосов
/ 14 марта 2011

Байт - это буквально 8-битное целое число, которое представляется там как целое число от 0 до 255, другими словами, в десятичной записи.Вы ожидали, что он будет представлен в двоичной записи, но на самом деле это будет означать то же самое.Насколько я могу сказать, это то, как Visual Studio в этом случае представляет это, но, возможно, кто-то может пролить некоторые подробности.

Файл изображения - это просто последовательный набор байтов, опять-таки, все они представлены здесь как десятичныецифры.

Надеюсь, что поможет.

...