C++中uint32_t存入uint8_t向量的原理及原数值还原方法问询
uint32_t转uint8_t的截断原理与还原可能性
转换原理
当把uint32_t类型的值插入vector<uint8_t>时,C++会执行隐式类型转换:uint8_t是仅能存储8位无符号整数的类型(取值范围0~255),转换过程会丢弃uint32_t值中高于第8位的所有二进制位,只保留最低的8位。
这个过程等价于对原数值执行按位与0xFF操作,或者取原数模256的结果(因为2^8=256)。
示例数值验证
我们针对你给出的两个数值计算:
- 对于
2344:2344 ÷ 256 = 9,余数为2344 - 9×256 = 40,对应二进制最低8位为00101000,即十进制40。 - 对于
4224:4224 ÷ 256 = 16,余数为4224 - 16×256 = 128,对应二进制最低8位为10000000,即十进制128。
这就是你输出中40和128的来源。
能否还原原始uint32_t值?
不能直接从当前输出还原原始值。
截断操作丢失了uint32_t中高24位的信息:所有低8位为40的uint32_t值(比如2344、2344+256=2600、2344+512=2856等)转换为uint8_t后都是40;同理,低8位为128的uint32_t值有无数个,仅靠输出的40和128无法确定原始值。
正确的字节存储与还原方式
如果需要完整保存uint32_t信息并后续还原,需将每个uint32_t拆分为4个uint8_t字节存入容器(以下以小端字节序为例,即先存最低位字节):
存储代码示例
#include <iostream> #include <vector> #include <cstdint> using namespace std; int main() { vector<uint8_t> B; vector<uint32_t> A; B.push_back(3); B.push_back(5); A.push_back(2344); A.push_back(4224); // 将每个uint32_t拆分为4个uint8_t字节(小端) for (uint32_t val : A) { B.push_back(static_cast<uint8_t>(val & 0xFF)); B.push_back(static_cast<uint8_t>((val >> 8) & 0xFF)); B.push_back(static_cast<uint8_t>((val >> 16) & 0xFF)); B.push_back(static_cast<uint8_t>((val >> 24) & 0xFF)); } // 输出所有字节 for (uint8_t byte : B) { cout << unsigned(byte) << " "; } // 输出结果:3 5 40 9 0 0 128 16 0 0 return 0; }
还原代码示例
从B中还原原始uint32_t值:
// 假设B中从索引2开始存储了两个uint32_t的字节(小端) uint32_t original_val1 = static_cast<uint32_t>(B[2]) | (static_cast<uint32_t>(B[3]) << 8) | (static_cast<uint32_t>(B[4]) << 16) | (static_cast<uint32_t>(B[5]) << 24); // original_val1 = 2344 uint32_t original_val2 = static_cast<uint32_t>(B[6]) | (static_cast<uint32_t>(B[7]) << 8) | (static_cast<uint32_t>(B[8]) << 16) | (static_cast<uint32_t>(B[9]) << 24); // original_val2 = 4224
内容的提问来源于stack exchange,提问作者Sebastian Orteho
相关产品推荐
相关产品推荐

