【发布时间】:2019-08-06 10:07:09
【问题描述】:
我要通过 tcp 发送一个 int64 并且需要对其进行序列化和反序列化。
首先我将其转换为 uin64。
我将它字节转换成一个 uint8 数组。
然后我将数组字节转换为 uint64
最后将其转换回 int。
但它返回的值与我输入的不同... 我检查了十六进制值,但它们应该是正确的......
代码:
#include <math.h>
#include <string.h>
#include <iostream>
#include <iomanip>
//SER & D-SER int64
std::array<uint8_t, 8> int64ToBytes(int64_t val)
{
uint64_t v = (uint64_t)val;
std::array<uint8_t, 8> bytes;
bytes[0] = (v&0xFF00000000000000)>>56;
bytes[1] = (v&0x00FF000000000000)>>48;
bytes[2] = (v&0x0000FF0000000000)>>40;
bytes[3] = (v&0x000000FF00000000)>>32;
bytes[4] = (v&0x00000000FF000000)>>24;
bytes[5] = (v&0x0000000000FF0000)>>16;
bytes[6] = (v&0x000000000000FF00)>>8;
bytes[7] = (v&0x00000000000000FF);
return bytes;
}
int64_t bytesToInt64(uint8_t bytes[8])
{
uint64_t v = 0;
v |= bytes[0]; v <<= 8;
v |= bytes[1]; v <<= 8;
v |= bytes[3]; v <<= 8;
v |= bytes[4]; v <<= 8;
v |= bytes[5]; v <<= 8;
v |= bytes[6]; v <<= 8;
v |= bytes[7]; v <<= 8;
v |= bytes[8];
return (int64_t)v;
}
int main() {
uint8_t bytes[8] = {0};
int64_t val = 1234567890;
//Print value to be received on the other side
std::cout << std::dec << "INPUT: " << val << std::endl;
//Serialize
memcpy(&bytes, int64ToBytes(val).data(), 8);
//Deserialize
int64_t val2 = bytesToInt64(bytes);
//print deserialized int64
std::cout << std::dec << "RESULT: " << val2 << std::endl;
}
输出:
INPUT: 1234567890
RESULT: 316049379840
解决了一天,没找到问题
谢谢。
【问题讨论】:
-
在您的 bytesToInt64 函数中,您缺少 byte[2] 索引,因此反向函数与转换函数不同。如果您更正了索引,您的功能可能会很好地工作。
标签: c++ serialization deserialization byte-shifting