如何 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
。
我在这里尝试做的是像在 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
。