二进制零和ASCII字符零之间的差异

时间:2013-07-31 16:13:45

标签: c

gcc (GCC) 4.8.1
c89

您好,

我正在读一本关于指针的书。并使用此代码作为示例:

memset(buffer, 0, sizeof buffer);

填充缓冲区将是二进制零而不是字符零。

我只是想知道二进制和字符零之间有什么区别。我认为这是一回事。

我知道文本数据是人类可读的字符,而二进制数据是不可打印的字符。如果我错了,请纠正我。

什么是二进制数据的好例子?

如果您要处理字符串(文本数据),则应使用fprintf。如果您使用二进制数据,则应使用fwrite。如果要将数据写入文件。

非常感谢任何建议,

5 个答案:

答案 0 :(得分:11)

快速回答是字符'0'在二进制数据中用ASCII码48表示。这意味着,当你想要字符'0'时,文件实际上包含这些位:{ {1}}。同样,可打印字符00110000的十进制值为49,由字节'1'表示。 (00110001为65,表示为'A',而01000001为97,表示为'a'。)

如果你希望空终结符位于字符串01100001的末尾,实际上有一个0的十进制值,那么它将是所有零的字节:'\0'。这确实是0值。对于编译器,

之间没有区别
00000000

memset(buffer, 0, sizeof buffer);

唯一的区别是对我们来说是语义的。 memset(buffer, '\0', sizeof buffer); 告诉我们,我们正在处理一个角色,而0只是告诉我们我们正在处理一个数字。

查看ascii table会很有帮助。

'\0'使用ASCII输出数据并输出字符串。 fprintf写入纯二进制数据。如果你fwrite,它会将值48放在fp中,而如果你fprintf(fp, "0"),它会将实际值0放在文件中。 (注意,我对fwrite(fd, 0)fprintf的使用显然不是正确的用法,但显示了重点。)

注意:我的答案是指ASCII,因为它是最古老,最着名的字符集之一,但正如Eric Postpichil在评论中提到的那样,C standard不受ASCII限制。 (事实上​​,虽然它偶尔使用ASCII提供示例,但标准似乎不会假设ASCII将是使用的字符集。)。 fwrite使用已编译程序的执行字符集输出。

答案 1 :(得分:2)

如果您询问'0'0之间的区别,这两者完全不同:

  • 二进制零对应于不可打印的字符\0(也称为空字符),代码为零。此字符在C字符串中用作空终止符:
  

5.2.1.2所有位都设置为0的字节,称为空字符,应存在于基本执行字符集中;它用于终止字符串。

  • ASCII字符零'0'是可打印的(毫不奇怪,打印时产生零字符)并且十进制代码为48。

答案 2 :(得分:1)

二进制零:0
字符零:'0',其中ASCII48

答案 3 :(得分:1)

二进制数据:cpu可以使用的原始数据,一点一点,0和1的流(通常以8个为一组,也就是Bytes,或8的倍数)

字符数据:字节解释为字符。像ASCII这样的约定规定了终端,打印机,......等应该如何显示特定位序列的规则。 例如,二进制数据(位序列)00110000应显示为0

如果我没记错的话,无符号整数数据类型将在存储位的二进制值和解释值之间直接匹配(忽略像Endian ^^这样的奇怪现象)。

在更高层次上,例如谈论ftp传输,命运是在:

之间进行的
  • 数据应解释为(多)字节字符,即文本(这包括非字符符号,如换行符)
  • 数据是一个大位/字节流,不能用较小的人类可读位来分解,例如图像或编译的可执行文件

答案 4 :(得分:1)

在系统中每个字符都有一个代码,零ASCII码是0x30(十六进制)。 要用零字符填充此缓冲区,您必须输入以下代码:

memset(buffer,30,(size of buffer))