Binary Serialization

harakim harakim at gmail.com
Sat Jul 13 23:52:38 UTC 2019


I am receiving packets of data over the network from a 
C#/Java/dlang/etc. client.

I'm writing the data directly to a socket, one primitive value at 
a time in little endian format. I would like to receive this 
super easily in d. Here is an example of roughly what I want to 
do.

class MoveCommand
{
	byte serialNumber;
	int x;
	int y;
}

public void processMoveCommand(byte[] buffer, offset)
{
	MoveCommand command = *(cast(MoveCommand *)(buffer.ptr + 
offset));
}

When I do MoveCommand.sizeof, it returns 4. When I changed 
MoveCommand to a struct, it returns 12. Is that going to be 
reliable on every machine and with every compiler? It seems like 
I had to use __attributed_packed__ (something like this, it's 
been 10 years) to guarantee the actual byte layout of a struct in 
C when working with files. Do I have to even worry about this in 
D? If so, is there something comparable to attribute packed in D?

The alternative that I'm fearing would be that some compiler 
would choose word-based boundaries, it would pack that data or 
something else (I would hope not these). I would rather know how 
this works now and not have it come back to bite me when I least 
suspect it on some other machine.

I am happy to read about this stuff, but I don't know where to 
start. I have the book "The D Programming Language" if there is 
something in there that I missed.


More information about the Digitalmars-d-learn mailing list