如何以便携式方式顺序打印字节?

时间:2014-10-23 22:06:03

标签: c linux endianness

我在多线程程序中广泛使用了这个简单的函数:

char *Serial2String(char *serial) {
    static char str[LENGTH * 2 + 1];

    sprintf(str, "%08x%08x",
            ntohl(*(uint32_t *)(&serial[0])),
            ntohl(*(uint32_t *)(&serial[LENGTH / 2])));

    return str;
}

我从不同的线程上下文中调用它,静态变量不受并发保护。所以迟早会发生错误...我创建了这个函数来简化代码所需的代码,但却产生了并发问题。我正在寻找一种方法:

  • 具有此功能并发安全。持有互斥量会起作用。但是会使我的代码比现在更丑陋/更重。
  • 有一个宏或单行做同样简单的事情,可以在我需要的地方复制/粘贴它。内联工作,但我相信有一种更好的方式。

换句话说,如何以线程安全的方式以可移植的方式(从字节顺序)以特定顺序打印LENGTH字节?

编辑我通常直接在printf语句中调用它:

printf("error: no such device, serial:%s\n", Serial2String(&buf[1]));

1 个答案:

答案 0 :(得分:4)

我看到了几个选项。

使用malloc:

在函数内分配字符串
const char *str = Serial2String(serial);
// Use the string, free when you're done
free(str);

或者,让调用者在内存中传递一个字符串:

char str[256];
str = Serial2String(serial, str, 256);

如果您只在printf中使用它,则可以执行以下操作:

#define SERIAL_FORMAT "%08x%08x"
#define SERIAL2STR(s) ntohl(*(uint32_t *)(&s[0])), ntohl(*(uint32_t *)(&s[LENGTH / 2]))

printf("The serial is:" SERIAL_FORMAT "\n", SERIAL2STR(serial));