Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 二进制文件的Ascii范围?_C#_.net 4.0_Ascii_Binary Data - Fatal编程技术网

C# 二进制文件的Ascii范围?

C# 二进制文件的Ascii范围?,c#,.net-4.0,ascii,binary-data,C#,.net 4.0,Ascii,Binary Data,我一直在阅读关于这个话题的文章,但没有得到我问题的具体信息: (以下内容可能不正确,但请纠正我) 每个文件(文本/二进制)都在保存字节 字节为8位,因此最大值为2^8-1=255code 这255个代码分为两组: 0..127 : textual chars 128:..255 : special chars. 所以二进制文件包含整个范围的字符代码:0..255(ascii字符+特殊字符) 1)正确吗 2) 现在,假设我正在二进制文件中保存一个INT。(32位系统中为4字节) 文件如何告诉程序

我一直在阅读关于这个话题的文章,但没有得到我问题的具体信息:

(以下内容可能不正确,但请纠正我)

每个文件(文本/二进制)都在保存字节

字节为8位,因此最大值为
2^8-1=255
code

这255个代码分为两组:

0..127 : textual chars
128:..255 : special chars.
所以二进制文件包含整个范围的字符代码:
0..255
(ascii字符+特殊字符)

1)正确吗

2) 现在,假设我正在二进制文件中保存一个INT。(32位系统中为4字节)


文件如何告诉程序读取它:它的不是4个独立的不相关字节,而是
4个字节的int?

所有文件的底层都存储为字节,因此从某种意义上说,您所说的是正确的。然而,如果您打开一个打算以二进制形式读取的文件,并尝试在文本编辑器中读取它,它将看起来像胡言乱语

程序如何知道是将文件读取为文本还是二进制?(即作为ASCII或其他编码字节的特殊集合,或作为具有不同表示形式的底层字节)

嗯,它不知道——它只是按照它所说的去做

在Windows中,您可以在记事本中打开
.txt
文件-记事本需要读取文本。尝试在记事本中打开二进制文件。它会打开,你会看到东西,但它将是垃圾

如果您正在编写自己的程序,您可以使用
BinaryWriter
编写程序,如果希望将所有内容存储为二进制,则可以使用
BinaryReader
读取程序。如果使用
BinaryWriter
编写和使用
StringReader
读取,会发生什么情况


要回答您的具体示例,请执行以下操作:

using (var test = new BinaryWriter(new FileStream(@"c:\test.bin", FileMode.Create)))
{
    test.Write(10);
    test.Write("hello world");
}

using (var test = new BinaryReader(new FileStream(@"c:\test.bin", FileMode.Open)))
{
    var out1 = test.ReadInt32();
    var out2 = test.ReadString();

    Console.WriteLine("{0} {1}", out1, out2);
}
看看你怎么按照写的顺序读?文件没有告诉你任何事情

现在切换第二部分:

using (var test = new BinaryReader(new FileStream(@"c:\test.bin", FileMode.Open)))
{
    var out1 = test.ReadString();
    var out2 = test.ReadInt32();

    Console.WriteLine("{0} {1}", out1, out2);
}
你会被胡言乱语弄出来(如果它真的有效的话)。然而,文件中没有任何内容可以事先告诉你这一点。那里没有特别的信息。程序必须知道根据一些带外信息(某种规格)做什么

所以二进制文件包含整个范围的字符代码:0..255(ascii字符+特殊字符)

不,二进制文件只包含字节。值介于0和255之间。只有当你决定赋予他们这种意义时,他们才应该被视为性格。如果是二进制文件(例如JPEG),则不应这样做-图像数据中的字节65在逻辑上不是“a”-而是文件中该点的字节65的含义

(请注意,即使是文本文件也不分为“ASCII字符”和“特殊字符”-这取决于编码。在UTF-16中,每个代码单元占用两个字节,而不管其值如何。在UTF-8中,字节数取决于您试图表示的字符。)

文件如何告诉程序读取它:它不是4个独立的无关字节,而是一个4字节的int

文件没有告诉程序。程序必须知道如何读取文件。如果你让记事本打开一个JPEG文件,它不会向你显示图像——它会显示你胡言乱语。同样,如果您试图强制图像查看器像打开JPEG一样打开文本文件,它会抱怨该文件已损坏

读取数据的程序需要理解它们将要读取的数据的结构——它们必须知道预期的内容。在某些情况下,格式是非常灵活的,比如XML:有很好的指定层,但是程序读取具有更高级别含义的值—元素、属性等。在其他情况下,格式是绝对精确的:首先从一个4字节的整数开始,然后是两个2字节的整数或其他什么。这取决于格式

编辑:回答您的具体(重复)评论:


Im Cmd shell…您已经编写了二进制文件。我不知道你在那里做了什么。我怎么知道是一次读取4个单字节还是4个字节

读取数据的程序要么需要知道数据的含义,要么不知道。如果只是将文件从一个地方复制到另一个地方,则不需要知道数据的含义。它是一次复制一个字节还是一次复制全部四个字节并不重要

如果它确实需要知道数据的含义,那么仅仅知道它是一个四字节的整数并没有多大帮助——它需要知道这个整数意味着什么,可以对它做任何有用的事情。因此,您的文件是从命令shell写入的。。。这是什么意思?如果我不知道它是什么意思,那么我知道一次读取一个字节还是四个字节作为整数又有什么关系呢


(正如我前面提到的,有一个中间选项,代码可以理解没有意义的结构,并将该结构暴露给其他代码,然后赋予其意义——XML就是一个典型的例子。)

这都是解释的问题。文件和系统都不知道文件中发生了什么,他们只是将您的存储视为一个字节序列,其本身毫无意义。当你读一个单词时,同样的事情也会发生在你的大脑中(你试图选择一种语言来解释它,给字符序列赋予意义)

您的程序负责按照您想要的方式解释数据,因为没有单一的有效解释。例如,字节序列
48 65 6C 6C 6F 20 53 6F 6F 68 6A 75 6E
可以解释为:

  • 字符串(
    Hello Soohjun
  • 12个单字节字符的序列(
    H
    e
    l
    l
    o
    S
    o
    o
    H
    j
    u
    n
  • 三个无符号整数后跟一个字符的序列(121460644418643894871869113973110)
  • 后跟浮点数和uns的字符