kdb:c中的guid编码导致无效的序列化

时间:2018-11-26 22:15:06

标签: kdb

我正在尝试从C ++操作guid。每当我尝试序列化guid时,都会得到一个空指针。

U g={0};
auto k = ku(g);
auto p = ::b9(2, k);

手册的前两行直接用于创建空GUID。这将导致p == 0。

我实际上试图做的是创建一个guid列表,然后序列化:

k = ktn(UU, 3)
kU(k)[0] = <an instance of U with the g bytes initialized>
kU(k)[1] = <an instance of U with the g bytes initialized>
kU(k)[2] = <an instance of U with the g bytes initialized>

尝试序列化时不起作用。

1 个答案:

答案 0 :(得分:2)

我相信您应该使用3作为b9的第一个参数。例如:

jmcmurray@homer ~/c $ more test.c
#include"k.h"
K f(K x)
{
  K k = ktn(UU,3);I j=0;
  for(j=0;j<3;j++){
   U g={0};I i=0;
   for(i=j;i<j+16;i++){
    g.g[i] = (unsigned char)i;
   }
   kU(k)[0] = g;
  }
  return b9(3,k);
}
jmcmurray@homer ~/c $ gcc -shared -fPIC -DKXVER=3 test.c -o test.so
jmcmurray@homer ~/c $ q
KDB+ 3.5 2017.11.30 Copyright (C) 1993-2017 Kx Systems
l64/ 8()core 16048MB jmcmurray homer.aquaq.co.uk 192.168.1.57 EXPIRE 2019.06.30 AquaQ #52428

q)f:`:./test 2:(`f;1)
q)f[]
0x010000003e000000020003000000000002030405060708090a0b0c0d0e0f00ae67af727f000..
q)-9!f[]
00000203-0405-0607-0809-0a0b0c0d0e0f 001868af-727f-0000-6062-67af727f0000 a0a..
q)

在这里,我能够从共享对象中返回GUID的序列化列表,并在q端反序列化。在您的示例中尝试使用2时,在q中运行该函数时出现'type错误。

根据https://code.kx.com/q/interfaces/capiref/#b9-serialize 3表示

  

无数,压缩,允许时间跨度和时间戳序列化

2相同,没有“ compress”。所以我想您必须压缩GUID?