D - 是否有用于读取和写入字节的bytebuffer?

时间:2016-03-09 02:00:06

标签: bytearray d bytebuffer read-write

我今天刚刚开始学习D,我真的需要读取和写入这样的数据:

from scipy.optimize import *
from numpy.random import *
import matplotlib.pyplot as plt


draws=[np.random.lognormal(1,0.5) for i in range(n)]
x_1=[fsolve(lambda x:(-x**(alpha+1)+a*rho**2*x**alpha+(1-alpha)*a*(1-rho**2)*(xm/(a*(1-rho)**2))**alpha),0) for a in draws]

D中是否有可以实现此目的的内容,或者我必须自己制作?

2 个答案:

答案 0 :(得分:9)

我建议查看std.bitmanip的readpeekwriteappend函数。 e.g。

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[]) - 因此它们可能无法完全像您所做的那样工作寻找,但它们是为您需要从数组或其他类型的字节范围提取整数值的情况而设计的。如果你真的想要某种单独的缓冲区类型,那么你应该可以很容易地创建一个在内部使用它们。

答案 1 :(得分:0)

旧的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

正如页面上的警告所说,Phobos维护人员并不喜欢这个模块而想要杀死它......但是他们已经说过多年了,我只是去了提前并使用它。或者如果你愿意,可以制作stream.d源的私人副本。