将切片转换为本机(字节顺序)整数

Par*_*bay 7 d type-conversion endianness

我有一个字节(我知道这是一个保存为小端的整数),我想将它们转换为整数.

当我有一个静态大小的数组时没问题,但现在我有一个slice(ubyte[]).

是否仍然可以将其转换为整数,例如以这种方式?

ubyte[] bytes = ...;
uint native = littleEndianSliceToNative!uint(bytes);
Run Code Online (Sandbox Code Playgroud)

eme*_*esx 7

进一步研究亚当所写的内容,你可以编写一个简单的函数

T sliceToNative(T)(ubyte[] slice) if(isNumeric!T) {
    const uint s = T.sizeof,
               l = min(cast(uint)s, slice.length);

    ubyte[s] padded;
    padded[0 .. l] = slice[0 .. l]; 

    return littleEndianToNative!T(padded);
}
Run Code Online (Sandbox Code Playgroud)

您甚至可以littleEndianToNative创建泛型类型,以便镜像切片上的所有数组操作.


Ada*_*ppe 5

只需将切片明确切片到适当的大小:

import std.bitmanip;
void main() {
    ushort i = 12345;
    ubyte[2] swappedI = nativeToLittleEndian(i);
    ubyte[] slice = swappedI;

    alias Target = ushort; // make this a template param for a generic function
    assert(i == littleEndianToNative!Target(slice[0..Target.sizeof])); // the [0..Target.sizeof]
}
Run Code Online (Sandbox Code Playgroud)

这应该适用于任何需要的尺寸.