目的

把一个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