簡體   English   中英

如何將 uint64_t 存儲在數組中?

[英]How can one store a uint64_t in an array?

我正在嘗試將 crc64 校驗和的uint64_t表示形式存儲為數組。

校驗和總是像uint64_t res = 0x72e3daa0aa188782 ,所以我希望將其存儲為一個數組char digest[8] ,其中digest[0]為 72, digest[1]為 e3... digest[7]是82。

我嘗試循環/除以分解數字,但如果它是一個較小的 integer,並且如果起點是 Base-10,因為起點是 Base-16,則 output 應該但所描述的內容更合適以上。


更新:我刪除了無意義的代碼,並希望我能接受所有三個答案,因為他們都按照我的要求做了。 位移是我希望得到的答案,所以這就是它被接受的原因。

您應該使用除以 256,而不是除以 10:

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 

移位和按位與也可以做你需要的。 例如

unsigned char digest[8];
int shift = 56;
for (int i = 0; i < 8; ++i)
{
    digest[i] = (res >> shift) & 0xff;
    shift -= 8;
}

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

for (int i = 7; i >= 0; --i)
{
    digest[i] = res & 0xff;
    res >>= 8;
}

顯然,如果你除以 10,你會得到十進制數字,而不是你所期望的。 在這種情況下,您只想獲取uint64_t的底層位,這可以通過簡單的memcpy來完成。 但是您期望字節以大端順序排列,因此您還需要先轉換為大端

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 中也可以使用聯合來完成

union Digest
{
    uint64_t res;
    char bytes[8];
} digest;
digest.res = htonll(0x72e3daa0aa188782ull); // or htobe64
// now just use digest.bytes[]

這些只需要幾條機器指令,因此比為了獲得 8 個字節而循環 8 次要快得多

我認為您可以在這里使用union

union foo {
    uint64_t u64;
    uint8_t u8[8];
};

這使您不必進行任何轉換。 您可以使用foo.u64訪問 64 位值或使用foo.u8[0]foo.u8[7]訪問 8 位值。

嘗試這個:

#define INIT_LIST           \
201234567890123456,       \
12345678901234567890,     \
98765432109876543,        \
65432109887,              \
12345234512345,           \
217631276371261627,       \
12354123512453124,        \
2163521442531,            \
2341232142132321,         \
1233432112

#define STR_(...) #__VA_ARGS__
#define STR(x) STR_(x)

int main (void)
{
  uint64_t numbers[10] = { INIT_LIST };
  char array[] = STR(INIT_LIST);
  puts(array);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM