3
gcc (GCC) 4.8.1
c89

你好,

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

memset(buffer, 0, sizeof buffer);

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

我只是想知道二进制和字符零之间有什么区别。我以为是一样的。

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

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

举个例子,如果你正在处理字符串(文本数据),你应该使用fprintf. 如果你使用二进制数据,你应该使用fwrite. 如果要将数据写入文件。

非常感谢您的任何建议,

4

5 回答 5

13

快速的回答是,该字符'0'在二进制数据中由 ASCII 数字 48 表示。这意味着,当您需要字符'0'时,文件中实际上包含以下位:00110000. 类似地,可打印字符'1'的十进制值为 49,并由 byte 表示00110001。('A'为 65,表示为01000001,而'a'为 97,表示为01100001。)

如果您希望字符串末尾的空终止符 ,'\0'实际上具有 0 十进制值,因此将是一个全为零的字节:00000000. 这确实是一个 0 值。对于编译器来说,两者没有区别

memset(buffer, 0, sizeof buffer);

memset(buffer, '\0', sizeof buffer);

对我们来说,唯一的区别是语义上的区别。 '\0'告诉我们我们正在处理一个字符,而 0 只是告诉我们我们正在处理一个数字。

查看ascii 表会极大地帮助您。

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

注意:我的回答是指 ASCII,因为它是最古老、最著名的字符集之一,但正如 Eric Postpichil 在评论中提到的那样,C 标准不受 ASCII 约束。(事实上​​,虽然它偶尔会给出使用 ASCII 的示例,但该标准似乎特意从不假设 ASCII 将是所使用的字符集。)。 fprintf使用已编译程序的执行字符集输出。

于 2013-07-31T16:20:04.823 回答
2

如果您要问 和 之间的区别'0'0这两者是完全不同的:

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

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

  • ASCII 字符零'0'是可打印的(毫不奇怪,打印时会生成字符零)并且十进制代码为 48。
于 2013-07-31T16:19:38.110 回答
1

二进制零:0
字符零:'0',在ASCII中是48.

于 2013-07-31T16:17:39.120 回答
1

二进制数据:cpu 可以处理的原始数据,逐位,0 和 1 的流(通常以 8 个为一组,即字节或 8 的倍数组织)

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

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

在更高的层次上,例如谈论 ftp 传输,其目的是:

  • 数据应被解释为(多)字节字符,也就是文本(这包括非字符符号,如换行符)
  • 数据是一个大比特/字节流,不能分解成更小的人类可读比特,例如图像或编译的可执行文件
于 2013-07-31T17:33:32.090 回答
1

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

memset(buffer,30,(size of buffer))
于 2013-07-31T17:55:30.530 回答