How to pack a struct to a ubyte[] in a more "The D way" style ?

Binghoo Dang dangbinghoo at gmail.com
Mon Dec 18 05:32:02 UTC 2017


Thanks for your idea.

On Monday, 18 December 2017 at 05:08:24 UTC, Jonathan M Davis 
wrote:
>>          ubyte[] makeCMDPacket(RCPCmd cmd, in ubyte[] data)
>>          {
>>              this.preamble = RCPPKT_PRE;
>>              this.hdr.msgtype = RCPMSG_CMD;
>>              this.hdr.cmdcode =  cast (ubyte) cmd;
>>              this.hdr.len = 0xffff & data.length;
>
> Why are you using & instead of simply casting to ushort? 
> Casting would be more idiomatic. Or you can use to!ushort if 
> you want to verify the size at runtime and have a ConvException 
> thrown if the value is too large.
>

I'm using & because I'm using a C-Style. and the length needs to 
be packed into 2bytes, for casting, I don't know what will happen 
if data.length is greater. In C & C++, this kind of the cast will 
cause errors. I don't know what D will do for this.

>> ```
>>
>> It's basically a C-style code, and it works perfect, But I 
>> know that this is not a "D-way", So, any suggestions?
>
> I'd suggest that you check out std.bitmanip if you haven't.
>
> https://dlang.org/phobos/std_bitmanip.html
>
> append, peek, read, and write in particular are useful if 
> you're putting various integral values into an array of ubyte[] 
> or reading them from it. Glancing over what you have, I'm 
> pretty sure that all of the bitshifts and bitwise &'s and can 
> be removed by using append or write to write the data to the 
> array and peek or read to read from it.
>
> Also, as far as D style goes, variables and enum values are 
> usually given camelCase names, whereas you've named your enum 
> values in all uppercase and your variables names in all 
> lowercase, and you've underscores in the middle of names. But 
> of course, you can do what you want on that. It's just that if 
> you make any libraries public (e.g. on code.dlang.org), it's 
> better to follow the D naming guidelines for anything in the 
> public API:
>
> https://dlang.org/dstyle.html
>
> - Jonathan M Davis

Yeah, thanks for the suggestion, I will check bit manipulation 
more in detail. I just heard of that, but I just did a 
misunderstanding that I think that is for packing and unpacking 
of bits.


More information about the Digitalmars-d-learn mailing list