On Thursday, 24 October 2019 at 13:33:30 UTC, 9898287 wrote:
What's the function for converting a ulong to a native-endian byte array?
For example,

auto bytes = 0x1234567890123456u64.to_ne_bytes();
// should yield
// [0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56] in big-endian and // [0x56, 0x34, 0x12, 0x90, 0x78, 0x56, 0x34, 0x12] in little-endian systems

Also, what's the function for constructing a ulong from a native-endian byte array?
For example,

auto value = from_be_bytes!ulong([0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56]);
// value is 0x1234567890123456

Rust equivalent:
https://doc.rust-lang.org/std/primitive.u64.html#method.to_ne_bytes

Use a cast:

    ulong n = 0x1122334455667788;
    ubyte[] bytes = (cast(ubyte*) &n)[0 .. n.sizeof];
    ulong m = *cast(ulong*) bytes.ptr;
    assert(m == n);

Note that if you're writing code that cares about the native byte order, there's a good chance you're making a mistake. Rob Pike has written a blog post titled "The byte order fallacy" discussing this in more detail:

https://commandcenter.blogspot.com/2012/04/byte-order-fallacy.html

If you need to convert between native byte order and big/little endian byte arrays (e.g., for serialization/deserialization), there are functions in `std.bitmanip` that you can use:

    https://dlang.org/phobos/std_bitmanip.html

Reply via email to