【问题标题】:Encode and combine int to 32bit int in C binary file在 C 二进制文件中将 int 编码并组合为 32 位 int
【发布时间】:2017-04-05 09:32:15
【问题描述】:

假设我有 2 个变量:

int var1 = 1; //1 byte
int var2 = 2; //1 byte

我想组合这些并编码为 32 位无符号整数 (uint32_t)。通过组合它们,它将是 2 个字节。然后我会用 2 个字节的 0 填充填充剩余空间。这是写入文件,因此需要这种特定类型的编码。

所以通过结合上面的示例变量,我需要的输出是:

1200 //4 bytes

【问题讨论】:

  • 您是说要将第一个值上移 24 位,第二个值上移 16 位吗?即使这是您的要求,除非您显示十六进制值,否则显示的值也不会是 1200...
  • an int 在大多数系统上不是 1 字节 ...
  • 换句话说:试着去实现你到底想要达到什么。在这个过程中,你可能会自己找到答案。大多数编程都是准确地指定您想要做什么,然后将其转换为代码。
  • 回答我这个问题:你认为数字 12345(12345)有 5 个字节吗?
  • 然后将它们写入字节。或者您可以通过将第一个值左移 24 并将第二个值左移 16 将它们“组合”起来,然后将结果或结果转换为 int,然后写入完整的 int。

标签: c uint32 uint32-t


【解决方案1】:

没有必要采取迂回的方式将这些值“组合”成uint32_t。二进制文件是字节流,所以写单个字节是很有可能的:

FILE * const out = fopen("myfile.bin", "wb");
const int val1 = 1;
const int val2 = 2;
if(out != NULL)
{
  fputc(val1, out);
  fputc(val2, out);
  // Pad the file to four bytes, as originally requested. Not needed, though.
  fputc(0, out);
  fputc(0, out);
  fclose(out);
}

这使用fputc() 将单个字节写入文件。它需要一个整数参数来写入值,但在内部将其视为unsigned char,本质上是“一个字节”。

回读同样简单,例如使用fgetc() 读出这两个值,当然还要检查是否失败。你也应该检查这些写入,因为错误处理,我省略了它。

【讨论】:

  • 应该有几个 fputc(0, out);在 fclose(out) 之前;完全回答这个问题(“我会用 2 个字节的 0 填充填充剩余空间。”)
  • 请注意,int 可以大于 255,如果您使用 fputc(256),它将写入 0。 @Alex - 如果您的变量用于保存字节,请将它们声明为 byte
  • @Neil True,这毫无意义,但 OP 想要什么。我添加了它们,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
相关资源
最近更新 更多