bigEndian in std.bitmanip
Salih Dincer
salihdb at hotmail.com
Thu Nov 2 11:29:05 UTC 2023
On Tuesday, 31 October 2023 at 14:43:43 UTC, Imperatorn wrote:
> It might make sense to change since little endian is the most
> common when it comes to hardware. But big endian is most common
> when it comes to networking. So I guess it depends on your view
> of what is most common. Interacting with your local hardware or
> networking.
I realized that I had to make my prefer based on the most common.
But I have to use Union. That's why I have to choose
little.Endian. Because it is compatible with both Union and
HexString. My test code works perfectly as seen below. I'm
grateful to everyone who helped here and [on the other
thread](https://forum.dlang.org/thread/ekpvajiablcfueyipcal@forum.dlang.org).
```d
enum sampleText = "Hello D!"; // length <= 8 char
void main()
{
//import sdb.string : UnionBytes;
mixin UnionBytes!size_t;
bytes.init = sampleText;
import std.digest: toHexString;
auto hexF = bytes.cell.toHexString;
assert(hexF == "48656C6C6F204421");
import std.string : format;
auto helloD = sampleText.format!"%(%02X%)";
assert(hexF == helloD);
import std.stdio;
bytes.code.writeln(": ", helloD); /* Prints:
2397076564600448328: 48656C6C6F204421 */
import std.conv : hexString;
static assert(sampleText == hexString!"48656C6C6F204421");
//import sdb.string : readBytes;
auto code = bytes.cell.readBytes!size_t;
assert(code == bytes.code);
bytes.init = code;
code.writeln(": ", bytes); /* Prints:
2397076564600448328: Hello D! */
assert(bytes[] == [72, 101, 108, 108, 111, 32, 68, 33]);
//import sdb.string : HexString
auto str = "0x";
auto hex = HexString!size_t(bytes.code);
hex.each!(chr => str ~= chr);
str.writeln; // 0x48656C6C6F204421
}
```
My core template (UnionBytes) is initialized like this, and
underneath I have the readBytes template, which also works with
static arrays:
```d
// ...
import std.range : front, popFront;
size_t i;
do // new version: range support
{
char chr; // default init: 0xFF
chr &= str.front; // masking
code |= T(chr) << (i * 8); // shifting
str.popFront; // next char
} while(++i < size);
}
auto opCast(Cast : T)() const
=> code;
auto opCast(Cast : string)() const
=> this.format!"%s";
auto toString(void delegate(in char[]) sink) const
=> sink.formattedWrite("%s", cast(char[])cell);
}
UnionBytes bytes; // for mixin
}
template readBytes(T, bool big = false, R)
{ // pair endian version 2.1
import std.bitmanip;
static if(big) enum E = Endian.bigEndian;
else enum E = Endian.littleEndian;
import std.range : ElementType;
alias ET = ElementType!R;
auto readBytes(ref R dat)
{
auto data = cast(ET[])dat;
return read!(T, E)(data);
}
}
```
SDB at 79
More information about the Digitalmars-d-learn
mailing list