如何在q / kdb中打包/解包一个字节

时间:2016-04-11 14:55:57

标签: kdb q-lang

我在这里要做的就是在c#中像我一样打包一个字节:

string symbol = "T" + "\0";
byte orderTypeEnum = (byte)OrderType.Limit;
int size = -10;

byte[] packed = new byte[symbol.Length + sizeof(byte) + sizeof(int)]; // byte = 1, int = 4
Encoding.UTF8.GetBytes(symbol, 0, symbol.Length, packed, 0); // add the symbol
packed[symbol.Length] = orderTypeEnum; // add order type
Array.ConstrainedCopy(BitConverter.GetBytes(size), 0, packed, symbol.Length + 1, sizeof(int)); // add size

client.Send(packed);

有没有办法在q中完成这个? 至于C#中的解包,我可以很容易地做到这一点:

    byte[] fillData = client.Receive();
    long ticks = BitConverter.ToInt64(fillData, 0);
    int fillSize = BitConverter.ToInt32(fillData, 8);
    double fillPrice = BitConverter.ToDouble(fillData, 12);

    new 
    {
        Timestamp = ticks,
        Size = fillSize,
        Price = fillPrice
    }.Dump("Received response");

谢谢!

1 个答案:

答案 0 :(得分:1)

一种方法是

symbol:"T\000"
orderTypeEnum: 123 / (byte)OrderType.Limit
size: -10i;
packed: "x"$symbol,("c"$orderTypeEnum),reverse 0x0 vs size / *

<强>更新

要执行相反操作,您可以使用1:功能:

(8 4 8; "jif")1:0x0000000000000400000008003ff3be76c8b43958 / server data is big-endian
("jif"; 8 4 8)1:0x0000000000000400000008003ff3be76c8b43958 / server data is little-endian
/ ticks=1024j, fillSize=2048i, fillPrice=1.234

*)使用BitConverter.GetBytes()时,您还应检查BitConverter.IsLittleEndian的值,以确保以正确的顺序通过网络发送字节。与流行的看法相反,.NET并不总是小端。 Hovewer,kdb +中的内部表示(0x0 vs ...返回的值)总是大端的。根据您的需要,您可能希望也可能不希望使用上面的reverse