0

使用 c# 创建了一个二进制文件:我使用的代码是这样的

     try            
         {
            Console.WriteLine("Binary Writer");

       using (BinaryWriter b = new BinaryWriter(File.Open("C:\\file.bin",FileMode.Create)))
            {  
                b.Write("world");
                b.Write("god");
                b.Write("its cool");
                b.Write("1000");
                b.Flush();
            }

        }
        catch (IOException ioexp)
        {
            Console.WriteLine("Error: {0}", ioexp.Message);
        }
    }

我看到的输出文件有 -

世界(这里的东西)上帝(这里的东西)很酷(这里的东西)1000

它不应该是二进制格式的东西吗?

4

3 回答 3

3

大多数简单的值类型很容易转换为二进制。它们有固定数量的字节可以表示它们的值。就像 byte 类型的变量一样,可以写成单个字节。一个 int 可以写成 4 个字节。一个小数可以写成 16 个字节。等等。

但是字符串很棘手,它们可以有可变长度。所以 BinaryWriter 必须做一些额外的事情来确保可以从文件中再次读回字符串。这是您在文件中看到的(这里的东西)。它存储字符串的长度。后跟字符串中的字符。

现在 BinaryReader 很容易读回字符串。它首先读取长度,然后知道要读取多少个字符。

请注意,这也意味着只能使用 BinaryReader 读取文件。当您编写另一个程序应该读取的文件时,这往往是一个问题。这确实意味着您永远不应该使用 Write(string) 方法。通常你会改用 Write(byte[]) 。使用正确的编码来生成那个字节[]。

于 2013-08-24T14:32:46.423 回答
1

输出到二进制文件中的文本不会神奇地看起来不同。文本以您在BinaryWriter实例中指定的编码存储。在您的情况下,由于未指定,因此根据BinaryWriter 的 MSDN 页面,它默认为 UTF-8 。

您在每个字符串之间看到的是每个字符串作为 UTF-7 编码的无符号整数前缀的长度。由于该数字采用“二进制”格式,因此它将显示为该值的 UTF-8 表示形式。

尝试在十六进制编辑器中打开文件,您将确切地看到 BinaryWriter 是如何编写字符串的。

于 2013-08-24T14:16:21.107 回答
0

实际上该文件是二进制格式的。每个文件都是二进制格式,文本文件和数据文件之间的区别在于,在文本文件上,每个字节将直接映射到它的字符表示。相反,您在这里看到的是,对于您在该文件中写入的每条信息,都有其他东西用于对该信息进行编码。

于 2013-08-24T14:16:06.413 回答