【问题标题】:Using system calls in C writing padded hex在 C 中使用系统调用编写填充的十六进制
【发布时间】:2015-02-05 20:54:53
【问题描述】:

嘿,所以我对 C 本身相当陌生,对在 C 中使用系统调用也很陌生,但我必须将它用于作业,所以我试图练习读写文件。读取工作正常,但由于某种原因,写入正在做奇怪的事情。它写入文件是我想写入文件的数字的某种填充十六进制表示。任何帮助将不胜感激!

buffer= 10;
if (write(file, &buffer,sizeof(int)) < sizeof(int)) {
    printf("Error in writing\n");
    exit(EXIT_FAILURE);
}

当我运行它时,它会将它放在文件中,但是当我打印出数字本身时,它会打印正确的数字

0a00 0000

【问题讨论】:

  • 如何检查文件?你如何检查所写的内容?你如何打开文件?这与 C# 或 C++ 有什么关系?
  • 你想写什么到文件?如果要将数字 10 写入文件,则必须先将其转换为字符串。

标签: c linux system-calls


【解决方案1】:

sizeof(int) 是 4 个字节(显然在您的环境中),它是 32 位,可以用 8 个十六进制数字表示,这就是您在文件中看到的内容。

您显然在Little Endian 机器上,因此首先写入最低有效字节。在大端机器上,您会在文件中看到 0000 000a。

【讨论】:

  • 但我想写入文件的是十进制表示而不是十六进制。我必须手动将其转换为十进制吗?
  • @JoshRoberts 如果您希望能够在记事本或您选择的任何文本编辑器中打开文件并在其中看到“10”,则必须编写 ASCII(或 unicode,再次取决于文本编辑器)那里的数字值。使用您拥有的代码(但使用 8 位 char 类型而不是 int,尝试编写值 49(“1”的 ASCII 代码)后跟 48(“0”的 ASCII 代码)。然后当你在文本编辑器中打开文件,你会看到“10”。当然,在十六进制编辑器或任何你以前看到的 0a00 0000 中,你会看到 3130。(2 个 8 位整数 49 和 48 的十六进制)
  • @JoshRoberts 您可以使用 12337(0x3031 十六进制)的单个 short 值(16 位)来实现相同的技巧。同样,在您的小端机器上,它会反转字节并将字节 49 十进制后跟 48 十进制写入文件,您的文本编辑器将显示“10”。
  • @JoshRoberts 请记住 write() 函数只是将位转储到文件中。在 0x3031 的情况下,它会写成 00110000 00110001。你如何解释这取决于你。文本编辑器会读取它并向您显示这 2 个字节(字符 1 和 0)的 ASCII 表示。或者您可以将其读取为十进制值 12337。或者任何您想要的。请务必记住,值本身与该值的表示之间存在差异。
【解决方案2】:

sizeof(int) 是 32 位,所以是 4 个字节。这意味着 4 组两个十六进制值。那有意义吗?所以它应该填充它,因为你正在写 4 个字节的价值。

【讨论】:

    【解决方案3】:

    使用 snprintf

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    main()
    {
        int file = creat("afile.txt",S_IRWXU);
        int buffer= 10;
        char sbuffer[10];
        snprintf(sbuffer,sizeof(sbuffer),"%d",buffer);
        if (write(file, &sbuffer,strlen(sbuffer)) < strlen(sbuffer)) {
            printf("Error in writing\n");
            exit(EXIT_FAILURE);
        }
        close(file);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2014-03-08
      • 1970-01-01
      • 2013-06-10
      • 2011-06-01
      相关资源
      最近更新 更多