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