有没有人知道有一个库提供了一个执行这个逻辑的函数,或者一个执行这个逻辑的方法?
我在试着转换:
unsigned char test[] = "\x00\x00\x56\x4b\x7c\x8a\xc5\xde";至:
94882212005342 / 0x0000564b7c8ac5de我知道我可以遍历test中的每个字节,并利用sprintf将每个字节转换为字符串,并使用strcat将它们连接到一个缓冲区中,然后通过strtoull将缓冲区字符串转换为unsigned long long。然而,我正在寻找更全面和简单的东西。有没有这样的办法?
发布于 2021-03-12 21:16:57
这只是数学而已。
unsigned char test[] = "\x00\x00\x56\x4b\x7c\x8a\xc5\xde";
unsigned long long num =
(unsigned long long)test[0] << 56 |
(unsigned long long)test[1] << 48 |
(unsigned long long)test[2] << 40 |
(unsigned long long)test[3] << 32 |
(unsigned long long)test[4] << 24 |
(unsigned long long)test[5] << 16 |
(unsigned long long)test[6] << 8 |
(unsigned long long)test[7] << 0;记住,在转换之前,要将类型转换为足够宽的范围。
您有8个值:
{ 0x00, 0x00, 0x56, 0x4b, 0x7c, 0x8a, 0xc5, 0xde }它在小数中是:
0 0 86 75 124 138 197 222你想要拥有:
94882212005342即:
94882212005342 = 0*2^56 + 0*2^48 + 86*2^40 + 75*2^32 + 124*2^24 + 138*2^16 + 197*2^8 + 222*2^0这是一个数学运算。您可以编写ex test[0] * 72057594037927936ull,但它的可读性不如test[0] << 56。
发布于 2021-03-12 21:20:01
我用memmove或memcpy函数https://www.tutorialspoint.com/c做了一些非常类似的事情。
long long int var = 0;
memmove( &var, test, sizeof(var) );确保使用系统的正确字节顺序。
发布于 2021-03-12 23:41:16
仅供记录,您可以简单地这样做:
#include <stdio.h>
#include <inttypes.h>
int main(int argc, char *argv[])
{
unsigned char test[] = "\x00\x00\x56\x4b\x7c\x8a\xc5\xde";
uint64_t val=0;
for(size_t i=0; i<8; i++)
val |= (uint64_t)test[i] << (7-i)*8;
printf("%" PRIu64 " %" PRIX64, val, val);
}https://stackoverflow.com/questions/66600509
复制相似问题