如何 pack/unpack q/kdb 中的一个字节

How to pack/unpack a byte in q/kdb

我在这里尝试做的是像在 c# 中那样打包一个字节:

string symbol = "T" + "[=12=]";
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");

谢谢!

一种方法是

symbol:"T[=10=]0"
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 并不总是小端法。但是,kdb+ 中的内部表示(0x0 vs ... 返回的值)始终是大端。根据您的需要,您可能想要也可能不想使用上面的 reverse