D - Есть ли байтовый буфер для чтения и записи байтов?

Я только начал изучать D сегодня, и мне действительно нужно читать и записывать такие данные:

byte[] bytes = ...;
ByteBuffer buf = new ByteBuffer(bytes);
int a = buf.getInt();
byte b = buf.getByte();
short s = buf.getShort();
buf.putInt(200000);

Есть ли что-то встроенное в D, что может достичь этого, или я должен сделать это сам?


person user3441843    schedule 09.03.2016    source источник


Ответы (2)


Я бы посоветовал взглянуть на read std.bitmanip, peek, write и append. например

ubyte[] buffer = [1, 5, 22, 9, 44, 255, 8];
auto range = buffer; // if you don't want to mutate the original

assert(range.read!ushort() == 261);
assert(range == [22, 9, 44, 255, 8]);

assert(range.read!uint() == 369_700_095);
assert(range == [8]);

assert(range.read!ubyte() == 8);
assert(range.empty);
assert(buffer == [1, 5, 22, 9, 44, 255, 8]);

Типа буфера нет — это бесплатные функции, которые работают с диапазонами ubyte (включая ubyte[]) — поэтому они могут работать не совсем так, как вы ищете, но они предназначены для случая, когда вам нужно извлечь целочисленные значения из массива или какого-либо другого диапазона байтов. И если вам действительно нужен какой-то отдельный тип буфера, вы сможете довольно легко создать его, который использует их внутри.

person Jonathan M Davis    schedule 09.03.2016
comment
Это должен быть настоящий ответ. Спасибо! - person deceleratedcaviar; 11.04.2017
comment
PS. Обратите внимание, что bitmanip по умолчанию равно Endian.bigEndian. - person deceleratedcaviar; 11.04.2017

Старый модуль std.stream должен помочь: http://dlang.org/phobos/std_stream.html#MemoryStream

MemoryStream buf = new MemoryStream(bytes);
// need to declare the variable ahead of time
int a;
// then read knows what to get due to the declared type
buf.read(a);
byte b;
buf.read(b);
but.write(200000); // that is an int literal so it knows it is int
buf.write(cast(ubyte) 255); // you can also explicitly cast

Как говорится в предупреждении на странице, сопровождающим Фобоса не нравится этот модуль, и они хотят его убить... но они годами говорили, что я просто буду использовать его. Или сделайте приватную копию исходного кода stream.d, если хотите.

person Adam D. Ruppe    schedule 09.03.2016
comment
Всегда плохая идея использовать устаревшие символы, не говоря уже о модулях, от Phobos. Это правда, что в std.stream какое-то время было примечание о том, что он будет удален без фактического признания его устаревшим, но на данный момент он фактически устарел (это означает, что его использование будет означать, что вы увидите сообщения об устаревании - и, возможно, многие из них), и он будет удален, после чего любой код, все еще использующий его, сломается. Итак, если вы хотите использовать std.stream, не стесняйтесь, но скопируйте его в свою базу кода. - person Jonathan M Davis; 09.03.2016
comment
Голосование против этого, потому что существуют неустаревшие решения. - person Bauss; 09.03.2016
comment
Если есть, то напишите свой ответ! - person DejanLekic; 09.03.2016