Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何以endian可移植方式按顺序打印字节?_C_Linux_Endianness - Fatal编程技术网

C 如何以endian可移植方式按顺序打印字节?

C 如何以endian可移植方式按顺序打印字节?,c,linux,endianness,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;

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

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;
}
我从不同的线程上下文调用它,静态变量不受并发性的保护。所以一个错误迟早会发生。。。我创建这个函数是为了在需要的地方简化代码,但是创建了一个并发问题。我正在寻找一种方法:

使此函数安全并发。持有互斥锁就行了。但是会使我的代码比现在更难看/更重。 让一个宏或一个行程序做同样的事情,简单到可以复制/粘贴到我需要的任何地方。内联工作,但我相信有一个更好的方法。 换言之,如何以线程安全的方式从endianness的角度以可移植的方式以特定顺序打印长度字节


编辑我通常在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));

我有几个选择

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

你问的是并发性和终结性,这似乎是两个完全不相关的话题……原子化并不能给你带来任何好处。问题是,静态缓冲区仍然是共享的。您不能使用信号量来确保一次只能有一个线程调用此函数吗?@Deduplicator您是对的。所以我在寻找一个单行程序而不是函数我找不到比内联更好的方法了你在问并发性和终结性,这两个似乎是完全无关的话题…原子化不会给你带来任何好处。问题是,静态缓冲区仍然是共享的。您不能使用信号量来确保一次只能有一个线程调用此函数吗?@Deduplicator您是对的。所以我在寻找一个单行程序,而不是一个函数,我找不到比InlineEdit更好的方法,我通常直接从printf调用它。必须在被调用方进行分配会使其比最初更重。有关执行此操作的宏方法,请参见我的编辑,如果您专门将其与printf一起使用。编辑我通常直接从printf调用它。必须在被调用方进行分配会使其比最初更重。如果您专门将其与printf一起使用,请参阅我的编辑以了解执行此操作的宏方法。