C++ 网络编程:字节序转换与数据重组
#include
int main() { uint32_t mapId = 1687228718; uint32_t tmpMapId = htonl(mapId);
std::vector<uint8_t> resOut;
uint8_t *ptr = reinterpret_cast<uint8_t*>(&tmpMapId);
for (size_t i = 0; i < sizeof(tmpMapId); ++i) {
resOut.push_back(*(ptr + i));
}
for (const auto& byte : resOut) {
std::cout << "0x" << std::hex << static_cast<int>(byte) << " ";
}
// 将字节重新转换为mapId
uint32_t restoredTmpMapId;
std::memcpy(&restoredTmpMapId, resOut.data(), sizeof(restoredTmpMapId));
uint32_t restoredMapId = ntohl(restoredTmpMapId);
std::cout << "\nRestored mapId: " << restoredMapId << std::endl;
return 0;
}
问题出在使用了错误的类型进行字节重组。应该使用 uint32_t 而不是 uint16_t 来表示 mapId,因为它是 4 个字节而不是 2 个字节。以下是修正后的代码:
#include
int main() { uint32_t mapId = 1687228718; uint32_t tmpMapId = htonl(mapId);
std::vector<uint8_t> resOut;
uint8_t *ptr = reinterpret_cast<uint8_t*>(&tmpMapId);
for (size_t i = 0; i < sizeof(tmpMapId); ++i) {
resOut.push_back(*(ptr + i));
}
for (const auto& byte : resOut) {
std::cout << "0x" << std::hex << static_cast<int>(byte) << " ";
}
// 将字节重新转换为mapId
uint32_t restoredTmpMapId;
std::memcpy(&restoredTmpMapId, resOut.data(), sizeof(restoredTmpMapId));
uint32_t restoredMapId = ntohl(restoredTmpMapId);
std::cout << "\nRestored mapId: " << restoredMapId << std::endl;
return 0;
}
输出结果为:
0x64 0x9f 0x0f 0x3b Restored mapId: 1687228718
现在字节重组正确,并且原始的 mapId 已经成功地恢复。
原文地址: https://www.cveoy.top/t/topic/oPdU 著作权归作者所有。请勿转载和采集!