kdb: кодирование guid в c приводит к неверной сериализации - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь манипулировать guid из C ++.Всякий раз, когда я пытаюсь сериализовать 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 голосов
/ 27 ноября 2018

Полагаю, вам следует использовать 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, как в вашем примере, я получил ошибку 'type при запуске функции в q.

Согласно https://code.kx.com/q/interfaces/capiref/#b9-serialize 3 означает

не перечислять, сжимать, разрешать сериализацию временного интервала и временной метки

2 - то же самое без "сжатого".Итак, я думаю, вы должны сжать GUID?

...