D Lang:std.bitmanip将数据读入结构
我发现这个函数: 但我不明白如何将数据读入结构 可以用这样的东西吗D Lang:std.bitmanip将数据读入结构,d,D,我发现这个函数: 但我不明白如何将数据读入结构 可以用这样的东西吗 struct MyType { uint value; this(ubyte act) { // wtf.peek!ubyte(); switch (act) { case 0: value = wtf.read!uint(); break; case 1:
struct MyType {
uint value;
this(ubyte act) { // wtf.peek!ubyte();
switch (act) {
case 0:
value = wtf.read!uint();
break;
case 1:
wtf.read!ubyte(); // seek
value = wtf.read!uint() | 0x7;
break;
...
}
}
}
...
buffer.read!MyType();
我不完全理解您的代码结构-wtf的
wtf
来自哪里
在我看来,您似乎误解了传递给MyType
的构造函数的内容-您可能应该传递范围,然后用std.bitmanip.read
读取该范围。不过,我可能误解了您的代码:
import std.range;
import std.bitmanip;
struct MyType {
uint value;
this(R)(auto ref R rng) if (isInputRange!R && is(ElementType!R : const(ubyte)))
{
auto act = rng.peek!ubyte;
switch (act) {
case 0:
value = rng.read!uint;
break;
case 1:
rng.read!ubyte;
value = rng.read!uint;
break;
// ...
default: assert(0);
}
}
}
unittest {
ubyte[] buffer = [0x01,0x12,0x34,0x56,0x78];
auto a = MyType(buffer);
assert(buffer.length == 0);
assert(a.value == 0x12345678);
}
如您所见,我只需使用数组作为参数调用MyType
的构造函数,但如果您确实想:
alias read = std.bitmanip.read;
T read(T : MyType, R)(auto ref R range)
if (isInputRange!R && is(ElementType!R : const(ubyte)))
{
return MyType(range);
}
unittest {
ubyte[] buffer = [0x01,0x12,0x34,0x56,0x78];
auto a = buffer.read!MyType;
assert(buffer.length == 0);
assert(a.value == 0x12345678);
}
现在还不清楚你想达到什么目的,我只是想从ubyte[]读入我的结构。结构MyType是打包uint的一种实现。例如,当第一个字节等于0时,它读取4个字节;当第一个字节等于1时,它查找一个字节并读取4个字节。它具有动态大小。它还可以返回第一个字节而不执行任何操作。我想使用类似于
自动打包\u uint=buffer.read!MyType()代码>。我可以写一些包装,但有更好的方法吗?太棒了!这就是我需要的。非常感谢你的代码。
alias read = std.bitmanip.read;
T read(T : MyType, R)(auto ref R range)
if (isInputRange!R && is(ElementType!R : const(ubyte)))
{
return MyType(range);
}
unittest {
ubyte[] buffer = [0x01,0x12,0x34,0x56,0x78];
auto a = buffer.read!MyType;
assert(buffer.length == 0);
assert(a.value == 0x12345678);
}