Published on

pbc 序列化的问题

Authors
  • avatar
    Name
    Ushen
    Twitter

云风的pbc库已经停止维护了,但是公司还在用。 之前碰到一个问题, 传输float数组的时候会出现数据错乱的情况。

经测试发现, 数组奇数位是正常的(因为是lua,从1开始), 我怀疑是因为把float当成double了, float占4字节, double占8字节,所以偶数位元素其实读到的是前一个元素的高位。

拉代码下来查看, 发现了问题

    static void
    _pack_packed_32(struct _packed *p,struct pbc_wmessage *m) {
        int n = pbc_array_size(p->data);
        int len = n * 4;
        int i;
        pbc_var var;
        _expand_message(m,10 + len);
        m->ptr += _pbcV_encode32(len, m->ptr);
        switch (p->ptype) {
        case PTYPE_FLOAT:
            for (i=0;i<n;i++) {
                _pbcA_index(p->data, i, var);
                float_encode(var->real , m->ptr + i * 8); //TODO ushen i * 4??
            }
            break;
        default:
            for (i=0;i<n;i++) {
                _pbcA_index(p->data, i, var);
                int32_encode(var->integer.low , m->ptr + i * 8); //TODO ushen i * 4??
            }
            break;
        }
        m->ptr += len;
    }

这里是按8字节来写入, 但是读取的时候只读取4字节