移动扩展ASCII码

时间:2017-12-06 22:14:46

标签: c io ascii unsigned-char

将扩展ASCII代码分配给unsigned char时,我注意到这些值在写入文件时会向上移动。

我将我的代码压缩到这个简单的程序中,简要介绍我的问题:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    unsigned char testascii[3];

    testascii[0] = 122;
    testascii[1] = 150;
    testascii[2] = 175;

    printf("%d\n", testascii[0]);
    printf("%d\n", testascii[1]);
    printf("%d\n", testascii[2]);

    return 0;
}

如果我运行这个简单的程序,我得到这个终端输出:

122
150
175

这是正确的。

如果我现在将以下内容添加到上述程序中:

FILE *f;
f = fopen("/mystuff/testascii", "wb");
if (f == NULL)
{
  printf("Error opening file\n");
  exit(1);
}
fwrite(testascii, 1, 3, f);
fclose(f);

它运行正常,但如果我现在去O / S并运行:

od -c testascii

我得到了这个输出:

0000000   z 226 257
0000003

如您所见,正确显示标准ASCII代码(低于128);但是扩展的ASCII代码(大于127)已更改。我希望它们分别为150和175,但它们分别为226和257。

如果我从文件打开命令中删除二进制标志,结果仍然相同。

作为最后的检查,我不再使用二进制打印(fwrite),而是再次更改代码并循环遍历数组并对每个项目执行fprintf,如下所示:

fprintf (fp, "%d", appendtxt[i]);

这是OD的显示:

0000000   1   2   2   1   5   0   1   7   5
0000011

这一切都告诉我二进制打印(fwrite)没有达到我的预期。我的理解是fwrite命令将二进制数据写入文件。在这种情况下,为什么成功写入小于128的值但是失败的值等于或大于128?

环境:   代码::块16.01   Centos 7.1

注意:我确实发现了类似的问题:fwrite with non ASCII characters但它似乎对我的情况没有帮助。我错了。如果我错过了该帖子中的内容,请告诉我?

1 个答案:

答案 0 :(得分:1)

你是以八进制打印的(默认情况下是od),226八进制是十进制的150。