On Wednesday, 25 March 2015 at 15:44:50 UTC, Hugo wrote:
Hi,

I need to append an uint as an array of ubytes (in little endian) to an existing array of ubytes. I tried to compile this code (with dmd 2.066.1 under Windows 7 x86-64):

void main() {
   ubyte[] buffer = [0x1f, 0x8b, 0x08, 0x00];
   import std.system;
   import std.datetime : Clock, stdTimeToUnixTime;
   import std.bitmanip : append;
buffer.append!ubyte(cast(uint)stdTimeToUnixTime(Clock.currStdTime), Endian.littleEndian);
}

But it gives me this error: template std.bitmanip.append cannot deduce function from argument types !(ubyte)(ubyte[], uint, Endian)

Supposedly append "Takes an integral value, converts it to the given endianness, and appends it to the given range of ubytes (using put) as a sequence of T.sizeof ubytes", so I thought I could use it, but after reading the documentation page for the function and the examples, I honestly can't understand where is the problem is.

Please, help!

Regards, Hugo

As per the signature in the docs:

void append(T, Endian endianness = Endian.bigEndian, R)(R range, T value)

The endianness is the second template argument. What you need to write is

buffer.append!(uint, Endian.littleEndian)(cast(uint)stdTimeToUnixTime(Clock.currStdTime));

or

append!(uint, Endian.littleEndian)(buffer, cast(uint)stdTimeToUnixTime(Clock.currStdTime));

Note that you don't need to specify the third template argument, that will be inferred automatically from the type of `buffer`

Reply via email to