gpt4 book ai didi

c - 如何以字节顺序可移植的方式按顺序打印字节?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:08 25 4
gpt4 key购买 nike

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

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 字节?

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

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

最佳答案

我看到了几个选项。

使用 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));

关于c - 如何以字节顺序可移植的方式按顺序打印字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26538295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com