我在这里要做的就是在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");
谢谢!
答案 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
。