question about using std.bitmanip.read

Nicholas Wilson via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Nov 6 19:53:13 PST 2015


On Saturday, 7 November 2015 at 03:19:44 UTC, Charles wrote:
> Hi guys,
>
> It's me again... still having some issues pop up getting 
> started, but I remain hopeful I'll stop needing to ask so many 
> questions soon.
>
> I'm trying to use std.bitmanip.read; however, am having some 
> issues using it. For basic testing I'm just trying to use:
>
>     read!double(endianess, ubyteArr).writeln;
>
> endianess is an Endian from std.system, and ubyteArr is an 8 
> byte ubyte[].
>
> When I run this I get:
>
> Error: template std.bitmanip.read cannot deduce function from 
> argument types !(double)(Endian, ubyte[]), candidates are:
>     std.bitmanip.read(T, Endian endianness = Endian.bigEndian, 
> R)(ref R range) if (canSwapEndianness!T && isInputRange!R && 
> is(ElementType!R : const(ubyte)))
> dmd failed with exit code 1.
>
>
> Clearly that didn't work, so I tried excluding the endianess:
>
>     read!double(ubyteArr).writeln;
>
> and that does work! But its the wrong byte order, so its 
> incorrect anyways.
>
> I went to std.bitmanip to look for unittests using the Endian, 
> and the only one that does uses read!(T, endianness), which 
> needs endianness to be known at compile time, which I don't 
> have.
>
> Any suggestions?

Cheat!

T read(T,R)(Endian endianness , R r)
{
          if(endianness == Endian.bigEndian)
                 return 
std.bitmanip.read!(T,Endian.bigEndian,R)(r);
          else if (endianness == Endian.littleEndian)
                 return 
std.bitmanip.read!(T,Endian.littleEndian,R)(r);
}

but...
you are on a little endian system (bigEndian gave wrong byte 
order )
you don't need to use bitmanip.read type repainting will work.
ubyte[] r = [ /* ... */ ];
double d = *cast(double*)r.ptr;



More information about the Digitalmars-d-learn mailing list