【问题标题】:C# - Reading bytes, what are they and what's going on. I expect binary values, not decimal numbersC# - 读取字节,它们是什么以及发生了什么。我期望二进制值,而不是十进制数
【发布时间】:2011-07-14 19:01:21
【问题描述】:

我已经做了几年程序员,但我从来没有不得不了解涉及字节的低级操作。不过这让我很感兴趣,我想了解更多关于使用字节的信息。

在下面的代码中,我正在读取一个仅包含“hi there”字样的文本文件。

        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”这样的二进制值,而不是“h”的 ascii 字符“104”。

在读取图像的情况下,当将图像读取到字节数组中时,我再次看到数组中的数字,并且从低级别的角度来看,我期望二进制值。我知道这些数字显然不会映射到 Ascii,但我很困惑为什么在读取字符串时它们会映射到 ascii 数字而在读取图像流时它会做其他事情(我实际上不确定数字代表什么在读取图像的情况下)。

我知道理解字节数组中的数字意味着什么并不重要,但它让我很感兴趣。

在读取文本文件和读取二进制文件(即图像)时,有人可以说明 .net 框架中的字节。谢谢你

此图像是保存从 myfile.txt 读取的文本“hi there”的字节数组 这个图像是一个字节数组,保存着一个图像流

【问题讨论】:

  • 这是任意的,您可以在设置中更改表示。大多数情况下,您希望看到以十进制表示的数字,因为它更易于阅读(在调试器中查看变量时,我不关心计算器),但数字就是数字。如果你真的想的话,你可以在 base 104 中将它表示为 1。
  • 我相信你需要从一本关于计算机科学基础的书开始。您的问题表明,尽管您知道如何编程,但您对程序为什么起作用却知之甚少,这有点危险,因为您将不了解它们为什么会失败。
  • 你确实知道二进制数和十进制数都是相同的数,对吧?
  • @Ed S.:以 10 为底的 104 与以 104 为底的 10 相同。
  • @Gabe:哈哈,哎呀。意味着在那里添加那个零......

标签: c# .net byte


【解决方案1】:

当然,所有低级别的东西都将存储为二进制值的集合。您在调试器中看到的是十进制表示。由于二进制值没有任何意义,除非我们对其进行解释,因此在这两种情况下(字符串和图像),您在调试器中看到的十进制数也是如此。

例如,当您从文件流中读取一个字节,然后使用如下编码对其进行解析:

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 或十进制数字赋予含义。它们本身没有任何意义。

【讨论】:

    【解决方案2】:

    一个字节由 8 位组成。它们可以以不同的方式写入,例如十进制值 (104)、二进制值 (1101000) 或头十进制值 (68)。它们的含义完全相同,只是值的不同表示。

    这与 ASCII 字符无关。它们恰好也是一个字节长(准确地说是 7 位)。

    【讨论】:

      【解决方案3】:

      字节实际上是一个 8 位整数,在此处表示为从 0 到 255 的整数 - 换句话说,以十进制表示法。您期望它以二进制表示法表示,但实际上它的含义相同。尽我所能说的是,这就是 Visual Studio 在这种情况下的表现方式,但可能还有一些其他人可以透露的细节。

      图像文件只是一组连续的字节,同样,这里都表示为十进制数字。

      希望对您有所帮助。

      【讨论】:

        【解决方案4】:

        01101000 是值 104 的 8 位表示。由于 c# 字节存储 8 位 (0-255),因此它向您显示为更具可读性。打开 windows 计算器并将视图更改为“程序员”,然后将其设置为“Bin”。可能会稍微清理一下。

        显示的不是十进制数,而是一个 c# 字节,一个从 0 到 255 的数字

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-27
          • 2018-06-09
          • 2013-09-13
          • 1970-01-01
          • 1970-01-01
          • 2020-07-23
          • 2018-06-02
          • 2019-04-11
          相关资源
          最近更新 更多