如何将 unsigned long long int 转换为 unsigned char*?

Posted

技术标签:

【中文标题】如何将 unsigned long long int 转换为 unsigned char*?【英文标题】:How to convert unsigned long long int into unsigned char*? 【发布时间】:2021-03-13 03:11:08 【问题描述】:

比如说我有这个unsigned long long int

unsigned long long int test_int = 0xcfffedefcfffeded; // 14987959699154922989

如何将test_int 转换为以下unsigned char* 数组:

unsigned char test_char[] = "\xcf\xff\xed\xef\xcf\xff\xed\xed";

与我问的这个问题类似: How to convert unsigned char* to unsigned long long int? 唯一的例外是反向。

【问题讨论】:

你试过什么?你做了什么研究?这个问题真的有必要吗?最后一个问题不是提示你怎么做吗?我什至链接了一个实现该转换的库 - 你研究过它吗?看看***.com/questions/3784263/…。 我只是在得知您的示例有效后才看了一下,我会重新阅读它。 请原谅我,但是@github.com/biiont/gpsd/blob/master/bits.h#L45 上的哪一行? 注意:"\xcf\xff\xed\xef\xcf\xff\xed\xed"9char 数组。 【参考方案1】:

带位移的内联转换(endian-indpendent)

char test_char[8];
test_char[0] = (char)(unsigned char)(test_int >> 56);
test_char[1] = (char)(unsigned char)(test_int >> 48);
test_char[2] = (char)(unsigned char)(test_int >> 40);
test_char[3] = (char)(unsigned char)(test_int >> 32);
test_char[4] = (char)(unsigned char)(test_int >> 24);
test_char[5] = (char)(unsigned char)(test_int >> 16);
test_char[6] = (char)(unsigned char)(test_int >> 8);
test_char[7] = (char)(unsigned char)(test_int);

奖励:我们不需要谈论对齐或字节序。这很有效。

正如 cmets 中所指出的,问题中的test_char 有一个尾随空终止符,我们也可以通过设置char test_char[9];test_char[8] = 0; 来做到这一点;然而,当这个问题在实践中出现时,真实的例子很少有终止的空值,也没有意义,因为中间有空值。

评论:我希望有一个标准的htonq,但没有。

【讨论】:

无论其值如何,这对任何unsigned char* 都有效吗? @mehmed_ali343:是的。 如何使用 7 字节 unsigned char 数组(6 + 空字节)来做到这一点。 @mehmed_ali343:你不能。 sizeof(unsigned long long) == 8

以上是关于如何将 unsigned long long int 转换为 unsigned char*?的主要内容,如果未能解决你的问题,请参考以下文章

将 unsigned long long 与 rpcgen 一起使用会产生错误

将 Long 转换为 Unsigned Short Int / Strtol

不能将 uint64_t 与 rdrand 一起使用,因为它需要 unsigned long long,但 uint64_t 被定义为 unsigned long

如何使用 printf 格式化 unsigned long long int?

将 int 转换为 unsigned long long

C51程序编写的时候要注意unsigned long的问题