首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在数组中存储uint64_t?

如何在数组中存储uint64_t?
EN

Stack Overflow用户
提问于 2020-11-30 07:19:01
回答 5查看 558关注 0票数 0

我试图将一个uint64_t表示形式的crc64校验和存储为一个数组。

校验和总是类似于uint64_t res = 0x72e3daa0aa188782,所以我希望它存储为一个数组,char digest[8],其中digest[0]是72,digest[1]是e3.digest[7]是82岁。

我尝试用循环/除法来分解这个数字,但是如果它是一个较小的整数,并且如果起点是Bas-10,因为起点是Bas-16,那么输出应该更合适,但是上面已经描述过了。

更新:我删除了荒谬的代码,希望我能接受所有的三个答案,就像他们都做了我要求的那样。这位改变是我希望得到的答案,所以这就是为什么它被接受。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-11-30 08:11:35

移动和比特-明智,也可以做你需要的。例如

代码语言:javascript
复制
unsigned char digest[8];
int shift = 56;
for (int i = 0; i < 8; ++i)
{
    digest[i] = (res >> shift) & 0xff;
    shift -= 8;
}

如果可以更改res的值,另一种方法是:

代码语言:javascript
复制
for (int i = 7; i >= 0; --i)
{
    digest[i] = res & 0xff;
    res >>= 8;
}
票数 1
EN

Stack Overflow用户

发布于 2020-11-30 08:00:18

您应该使用除法256,而不是10:

代码语言:javascript
复制
unsigned char digest[sizeof(uint64_t) / sizeof(char)];

for (int i = sizeof(digest) - 1; i >= 0; i--) {
   digest[i] = res % 256; // get the last byte
   res /= 256;            // get the remainder
}

// for demo purposes
for (int i = 0; i < sizeof(digest); i++) {
   printf("%x ", digest[i]); 
}

// 72 e3 da a0 aa 18 87 82 
票数 1
EN

Stack Overflow用户

发布于 2020-11-30 09:17:04

很明显,如果除以10,你就会得到十进制数,而不是你所期望的。在这种情况下,您只想获得uint64_t的底层部分,这可以用一个简单的memcpy来完成。但是您希望字节按大端顺序排列,所以您还需要首先转换为大端字节。

代码语言:javascript
复制
uint64_t number = 0x72e3daa0aa188782ull;

#ifdef __unix__
uint64_t number_be = htonll(number);
#else
uint64_t number_be = htobe64(number);
#endif

char digest[8];
memcpy(&digest, &number_be , sizeof number);

在C语言中,它也可以通过联合来完成。

代码语言:javascript
复制
union Digest
{
    uint64_t res;
    char bytes[8];
} digest;
digest.res = htonll(0x72e3daa0aa188782ull); // or htobe64
// now just use digest.bytes[]

这些只需要几个机器指令,因此要比8次循环得到8个字节要快得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65069427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档