2016-04-11 8 views
0

То, что я пытаюсь сделать здесь пакет байт, как я мог в C# как это:Как упаковать/распаковать байт в д/KDB

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); 

Есть ли способ сделать это в д ? Что касается Распаковка в 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

Один из способов сделать это является

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

UPDATE:

Чтобы сделать наоборот можно использовать 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, это не всегда мало-endian. Hovewer, внутреннее представление в kdb + (значение, возвращаемое 0x0 vs ...) всегда великодушно. В зависимости от ваших потребностей вы можете или не хотите использовать reverse выше.

+0

Спасибо! что отлично работало, но знаете ли вы, как сделать обратное? Я отредактировал этот вопрос, чтобы отразить это – Rtrader