gcc (GCC) 4.8.1
c89
您好,
我正在读一本关于指针的书。并使用此代码作为示例:
memset(buffer, 0, sizeof buffer);
填充缓冲区将是二进制零而不是字符零。
我只是想知道二进制和字符零之间有什么区别。我认为这是一回事。
我知道文本数据是人类可读的字符,而二进制数据是不可打印的字符。如果我错了,请纠正我。
什么是二进制数据的好例子?
如果您要处理字符串(文本数据),则应使用fprintf
。如果您使用二进制数据,则应使用fwrite
。如果要将数据写入文件。
非常感谢任何建议,
答案 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的字节,称为空字符,应存在于基本执行字符集中;它用于终止字符串。
'0'
是可打印的(毫不奇怪,打印时产生零字符)并且十进制代码为48。答案 2 :(得分:1)
二进制零:0
字符零:'0'
,其中ASCII为48
。
答案 3 :(得分:1)
二进制数据:cpu可以使用的原始数据,一点一点,0和1的流(通常以8个为一组,也就是Bytes,或8的倍数)
字符数据:字节解释为字符。像ASCII这样的约定规定了终端,打印机,......等应该如何显示特定位序列的规则。
例如,二进制数据(位序列)00110000
应显示为0
如果我没记错的话,无符号整数数据类型将在存储位的二进制值和解释值之间直接匹配(忽略像Endian ^^这样的奇怪现象)。
在更高层次上,例如谈论ftp传输,命运是在:
之间进行的答案 4 :(得分:1)
在系统中每个字符都有一个代码,零ASCII码是0x30(十六进制)。 要用零字符填充此缓冲区,您必须输入以下代码:
memset(buffer,30,(size of buffer))