如何创建字节文件?

How to create a byte file?

我正在制作一个 C/POSIX 程序来处理写入文件的矩阵。

我希望将每个矩阵写入不同的文件,格式如下:

  1. 所有数字都写成字节序列,跟在计算机的endiannes之后
  2. 所有数字都写在文件中逐行

因此,例如在具有 32 位 intlittle-endian 计算机中,以下矩阵:

| 100 200 |
| 300 400 |
| 500 600 |

将存储在一个字节序列中,我们可以这样表示(其中每个数字代表相应字节的十进制值):

100 0 0 0 200 0 0 0 44 1 0 0 244 1 0 0 88 2 0 0

由于我必须测试我的程序,我如何创建这样的输入文件

你只需写出数据

 int x = testvalue;
 fwrite(&x, 1, sizeof(int), fp);

然而 Posix 规范很糟糕。如果 int 的宽度或计算机的字节顺序发生变化,文件就会中断。这似乎是必需的行为。

查看我关于二进制文件可移植性的 github 项目

https://github.com/MalcolmMcLean/ieee754

最好写出二进制文件,这样文件而不是计算机来指定格式。然后便携阅读。 (对于浮点数来说很难,对于整数来说有一些陷阱而且并不完全简单)。

此代码:

int main(int argc, char* argv[])
{
   FILE *fp;
   fopen_s(&fp, "testfile.dat", "wb");
   int i[] = { 100, 200, 300, 400, 500, 600 };
   fwrite(i, sizeof(i), 1, fp);
   fclose(fp);
   return 0;
}

在 Visual Studio 的二进制编辑器中给我一个看起来像这样的文件:

64 00 00 00 C8 00 00 00 2C 01 00 00 90 01 00 00
F4 01 00 00 58 02 00 00

这是我对问题的解决方案:我创建了一个程序 (matrix_creator),它接收输出文件 (argv[1]) 的 path 和它需要的所有数字作为参数写入输出文件 (argv[2], argv[3],...).

我排除了所有错误控制以使代码更易于阅读:

int fd = open(path, O_RDWR|O_CREAT, 0644); // Create output file
for(int i = 2; i < argc; i++) { // Starts from argv[2]
    int t = strtol(argv[i], NULL, 0); // Parse each input number
    write(fd, &t, sizeof(t)); // Write the number in the given format
}
close(fd);

通过这种方式,我可以使用相同的程序为多个测试创建不同的文件

检查我安装的文件里面有什么ghex