如何在 C++ 中将 unsigned long long 复制到字节数组?

问题描述 投票:0回答:1

所以这是代码:

int thread = blockIdx.x * blockDim.x + threadIdx.x + 0xeafe7436;
uchar m[12];
uint res[4];
m[0] = (uchar)(thread & 0x000000ff);
m[1] = (uchar)((thread >> 8) & 0x000000ff);
m[2] = (uchar)((thread >> 16) & 0x000000ff);
m[3] = (uchar)((thread >> 24) & 0x000000ff);

for (unsigned long long i = 0; i < 0xffffffffffffffff; i++) {
    m[4] = (uchar)(i & 0x00000000000000ff);
    m[5] = (uchar)((i >> 8) & 0x00000000000000ff);
    m[6] = (uchar)((i >> 16) & 0x00000000000000ff);
    m[7] = (uchar)((i >> 24) & 0x00000000000000ff);
    m[8] = (uchar)((i >> 32) & 0x00000000000000ff);
    m[9] = (uchar)((i >> 40) & 0x00000000000000ff);
    m[10] = (uchar)((i >> 48) & 0x00000000000000ff);
    m[11] = (uchar)((i >> 56) & 0x00000000000000ff);
    md5(m, 12, res);
}

我认为移位和按位运算使我的代码比应有的速度慢,所以我想尝试使用

memcpy
看看是否更快。

我想将

i
的值复制到
m
,从索引 4 开始。我该如何使用
memcpy
来执行此操作?我研究了其他问题,但发现它们令人困惑且难以理解,并且我自己无法做到。

编辑:我已经在其他代码的上下文中测试了上面的代码,它很快。但我想使用 memcpy 来测试它的速度。因此,我不想单独设置字节数组

m
的每个字节,而是想使用 memcpy 在一次操作中完成此操作。因此,将
i
的值复制到
m
,以便 m 的每个字节(从索引 4 到 11)对应于 i 中的一个字节。
i
是一个unsigned long long,有8个字节。因此,将每个字节从
i
复制到
m
,以便 m[4] = i 的第一个字节,m[5] = i 的第二个字节等等。我认为这个目标的措辞非常好。

c++ arrays memcpy
1个回答
0
投票

你想太多了。了解 unsigned long long 和字节数组本质上只是内存位置。您想要/需要做的就是将数据从一个复制到另一个。然后可能会发现字节顺序问题。

int main()
{
    unsigned long long value = 0x123456789ABCDEF0;
    uint8_t byteArray[sizeof(unsigned long long)];
    std::memcpy(byteArray, &value, sizeof(value));

    // This will reverse the byte order to match the original endianness
    // Discard if not needed.
    // If you're using C or C++ older than 17, you'll need to byte swap with a 
    // for loop
    std::reverse(byteArray, byteArray + sizeof(byteArray));

    std::cout << "Array: ";
    for (size_t i = 0; i < sizeof(byteArray); ++i) 
    {
        std::cout << std::hex << static_cast<int>(byteArray[i]) << " ";
    }

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.