【问题标题】:Write Hex into a file (not as ASCII) in C在 C 中将十六进制写入文件(不是 ASCII)
【发布时间】:2020-01-25 05:13:16
【问题描述】:

我正在尝试用 C 语言编写一个具有十六进制值表示的文件

类似这样的:

char Msg[4] = {0x3f, 0x2a, 0x01, 0x52};

我在文件中寻找的输出是这样的:“3f2a0152”

我使用fprintf 在十六进制表示之前附加一些文本,但我无法成功编写它

FILE *LOG_FILE= fopen("./Hex.log", "a");
fprinf(LOG_FILE, "%d OUT %x", Timestamp, Msg);
fclose(LOG_FILE);

有什么建议吗?

【问题讨论】:

  • 您的意思是问:“如何将 char 数组中的字节打印为十六进制文本文件?”

标签: c file hex


【解决方案1】:

行:

fprintf(LOG_FILE, "%d OUT %x", Timestamp, Msg);

Msg 衰减为一个指针(0x3f 的地址),然后将 那个打印出来。

您需要做的是将每个元素输出为两位十六进制值,例如:

fprintf(LOG_FILE, "%d OUT %02x%02x%02x%02x\n", Timestamp, Msg[0], Msg[1], Msg[2], Msg[3]);

此外,它们可能应该被指定为unsigned char,这样它们在传递到fprintf 时不会进行符号扩展。否则,您将不得不做一些丑陋的事情,例如:

fprintf(LOG_FILE, "%d OUT %02x%02x%02x%02x\n", Timestamp, (unsigned)(Msg[0]), 
    (unsigned)(Msg[1]), (unsigned)(Msg[2]), (unsigned)(Msg[3]));

如果您想要一个更通用的解决方案,您可以组合一个函数来完成它,例如:

void LogHex(FILE *fh, int tstamp, char *preamble, unsigned char *mem, size_t sz) {
    fprintf(fh, "%d %s", tstamp, preamble);
    for (size_t i = 0; i < sz; ++i) {
        fprintf(fh, "%02x", mem[i]);
    }
    fprintf(fh, "\n");
}
:
LogHex(LOG_FILE, Timestamp, "OUT ", Msg, sizeof(Msg));

【讨论】:

  • 但是当 Msg 的长度可变时会发生什么?
  • @Alexis,我已经为可变长度缓冲区提供了一种更好的方法。
猜你喜欢
  • 2014-03-16
  • 2010-11-26
  • 2013-05-03
  • 2013-05-03
  • 2010-10-12
  • 2011-08-02
  • 2014-11-04
  • 2011-12-09
  • 2015-08-22
相关资源
最近更新 更多