#include #include #include #include #include <arpa/inet.h>

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 #include #include #include #include <arpa/inet.h>

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 已经成功地恢复。

C++ 网络编程:字节序转换与数据重组

原文地址: https://www.cveoy.top/t/topic/oPdU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录