目的
把一个ulong(uint64_t)的数字保存到标签内存里面区,给标签分配了8个字节。现在是要写进去,以及写进去后能读出来。
第一步
把uint64_t写到内存中
void UHFReader_Worker::Write(uint64_t uid) const{ QByteArray data; data.append(uid); //把uint64_t转成byte
FILMSOUT_DEBUG(logger, QString("data:%1") .arg(QString(data.toHex(' ').toUpper())));
}
测试
TEST_F(FilmsOut_ReaderTest, write) { uint64_t u = 1; reader->worker()->Write(u); u = 101; reader->worker()->Write(u); u=10105; reader->worker()->Write(u); }
结果
FilmsOut_ReaderTest.write 07:57:06,932.457 [18484] DEBUG uhf.worker - data:01 07:57:06,932.661 [18484] DEBUG uhf.worker - data:65 07:57:06,932.840 [18484] DEBUG uhf.worker - data:79
第一个和第二个没有问题,第三个明显问题。难道不应该是 27 79么
问题在哪儿
帮助文档里面说
QByteArray &QByteArray::append(char ch)
并没有说可以append(uint64_t x)的类型,但是编译器也不报错。看来编译器把uint64_t 自动转换成 char也就是int8_t了,转的过程只取了uint64_t的低8位。(我也就入坑了)
怎么解决
既然uint64占用8字节,那就先占用8字节。然后把uint64的复制过去。
QByteArray data; data.resize(8); //长度固定8字节 memcpy(data.data(),&uid,sizeof(uid)); //复制到字节数组里
结果
FilmsOut_ReaderTest.write 08:12:10,456.758 [22020] INFO tst.reader - open eqp connect:0 08:12:10,456.993 [22020] DEBUG uhf.worker - data:01 00 00 00 00 00 00 00 08:12:10,457.175 [22020] DEBUG uhf.worker - data:65 00 00 00 00 00 00 00 08:12:10,457.337 [22020] DEBUG uhf.worker - data:79 27 00 00 00 00 00 00
结果还是不对头哇
大小端问题
还需要反转一下数组,
QByteArray data; data.resize(8); memcpy(data.data(),&uid,sizeof(uid)); std::reverse(data.begin(),data.end()); //反转数组
最后
FilmsOut_ReaderTest.write name:COM8 fail: 1. 08:14:27,353.655 [22308] INFO tst.reader - open eqp connect:0 08:14:27,354.004 [22308] DEBUG uhf.worker - data:00 00 00 00 00 00 00 01 08:14:27,354.378 [22308] DEBUG uhf.worker - data:00 00 00 00 00 00 00 65 08:14:27,354.688 [22308] DEBUG uhf.worker - data:00 00 00 00 00 00 27 79标签:uint64,uhf,00,QByteArray,Qt,worker,DEBUG,data From: https://www.cnblogs.com/Dtscal/p/17178505.html