以整数形式访问无符号字符数组的元素
Access elements of an unsigned char array as integers
我必须使用仅接受*unsigned char
作为输入的读取函数,
typedef unsigned char byte;
byte * rx_data;
rx_data = new byte [RX_PACKET_LEN*packets];
如何以简单的方式将rx_data
读取为整数(4字节)数组?
你可以投射它:
int* pInt = reinterpret_cast<int*>( rx_data);
或
int* pInt = (int*) rx_data;
或者,如果要保留名称,请在需要读取时将其转换为:
((int*)rx_data)[0];
请注意,只有在您绝对确定自己在做什么时才应该这样做,否则不安全。(嗯,我知道这个 CA 适用于任何地方,但这需要特别注意)。我想到的东西 - RX_PACKET_LEN*packets
应该是sizeof(int)
的倍数.
由于这是C++,因此应使用 reinterpret_cast 将无符号 char 指针强制转换为 int 指针:
int * data = reinterpret_cast<int*>(rx_data);
但是,这假设数据以特定的字节序格式存储,因此如果字符数组来自具有不同字节序的不同平台,则此代码将不起作用。如果您假设相同的平台,那么您可能会没问题。
在一般设置中唯一安全的方法是制作副本:
std::vector<int32_t> target(RX_PACKET_LET * packets / sizeof(int32_t));
std::copy(rx_data, rx_data + RX_PACKET_LET * packets,
reinterpret_cast<unsigned char *>(target.data()));
现在你可以阅读target[0]
、target[1]
、...作为整数。
你可以为此使用 memcpy。
byte *rx_data = ...
size_t rx_data_size = ...
std::array<int, rx_data_size/sizeof(int)> data;
std::memcpy(data.get(), rx_data, data.size() * sizeof(int));
// read and modify data
// if you need to write it back out to rx_data then copy data back when you're done
std::memcpy(rx_data, data.get(), data.size() * sizeof(int));
这样做的好处是它不涉及强制转换,处理未对齐的内存,并且不依赖于晦涩难懂的混叠规则。
一个缺点可能是复制数据可能会导致性能降低。但是,这并不能保证。现代编译器通常将 memcpy 实现为编译器内部函数,优化器可以推理其行为。
我刚刚尝试了LLVM,发现这些:
void increment(char *buf) {
int i;
memcpy(&i,buf,sizeof(int));
++i;
memcpy(buf,&i,sizeof(int));
}
void increment(int &i) {
++i;
}
生成几乎相同的 IR 表示 (clang tmp.cpp -emit-llvm -o - | opt -S -O2) 和完全相同的x86_64程序集。
将指针类型从 byte* 更改为 int* 时,当递增指针 (p++) 时,将自动读取 4 个字节或跳转 4 个字节。只需确保字节数组大小为模块 4,这样就不会出现分段错误。
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- 字符数组中的元素数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用字符数组作为 Map 中的键
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 按顺序声明的字符数组重叠
- 在 C++ 中字符串的大小与字符数组的大小
- 寻找一种更好的方法来表示无符号字符数组
- 如何打印 2D 字符数组C++
- 从字符数组的元素中减去'a'是什么意思
- 我是否不正确地集中了这些字符数组?