如何将 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"
是 9 的 char
数组。
【参考方案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