将32位整数复制到字节数组中的C++代码

3
有没有可能通过单个赋值将32位值复制到8位字符数组中?
假设我有一个字节数组(uint8 *),其内容为:
01 12 23 45 56 67 89 90
是否可以通过强制类型转换或其他方式一次性将数据复制到该数组中? 例如,将0x555555这样的值复制到数组中,以便我们最终得到:
55 55 55 55 56 67 78 90

4
通常,“复制”(无论是通过铸造还是memcpy完成)的行为会根据本地字节顺序或CPU而有所不同。 - Some programmer dude
4个回答

4
*( (unsigned int *)address_of_byte_buffer) = 0x55555555

注意64位代码下int的大小......你需要找到一个数据类型,它在两种架构下始终是32位,例如uint32_t


我已经尝试过那个,但似乎只复制了底部的字节。例如,对于 char a[] = "blahblah"; *((unsigned int*)a) = 0x555555; printf("%x", a); 这样的代码,我会看到类似于 0xffffff55 的输出。 - Verhogen
只要你的字节数组是原生的C数组(new uint8 [size])那么它应该可以工作-你能贴上一些代码吗?你是试图对一些类如CByteArray这样做吗?除非该类保证连续的内存,否则这是不可能的-而且你真不应该依赖于它。 - JTeagle
你不能在字符数组指针上使用 %x - 它会打印出指针的值。尝试使用 printf("%02x%02x%02x%02x", a[0], a[1], a[2], a[3])。另外,最好将其设置为 unsigned char。 - JTeagle

1

尽管您确实需要穿着带有钢尖头的靴子才能使用它,但您可以使用 reinterpret_cast

#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>

int main()
{
    using std::vector;
    using std::copy;
    using std::back_inserter;
    using std::ostream_iterator;
    using std::cout;

    int a = 0x55555555;

    char* a_begin = reinterpret_cast<char*>(&a);
    char* a_end = a_begin + 4;

    vector<char> chars;

    copy(a_begin, a_end, back_inserter(chars));

    copy(chars.begin(), chars.end(), ostream_iterator<int>(cout, ", "));

    return 1;
}

输出:

85, 85, 85, 85, 

0

0
你可以使用类似这样的代码:
unsigned long* fake_long = reinterpret_cast<unsigned long*> (char_array); *fake_long = 0x55555555;

但是这种解决方案只适用于大端机器。如果要在小端机器上运行(可能是你想要的),则应该转换您的长变量的字节序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接