eraggo
eraggo

Reputation: 21

Weird hexadecimal format

Following hexdump shows some data made by device i have on my hands. It stores year, month, day, hour, minute, seconds, and lenght in weird way for me (4 bytes marks for single digit in reverse order).

de 07 00 00 01 00 00 00  16 00 00 00 10 00 00 00
24 00 00 00 1d 00 00 00  15 00 00 00 X X X X

For example: Year is marked as "000007de" aka 0x07de (=2014). Now; problem i am having is how to properly handle this in c/c++. (first 4 bytes)

How do i read those 4 bytes with "reverse" order to make proper hexadecimal for handling afterwards with like ints/longs?

Upvotes: 2

Views: 138

Answers (2)

atenart
atenart

Reputation: 319

If you read it in the reverse order, you can then change the endianness with something like:

uint32_t before = 0xde070000;
uint32_t after = ((before<<24) & 0xff000000) |
                 ((before<<8)  & 0xff0000)   |
                 ((before>>8)  & 0xff00)     |
                 ((before>>24) & 0xff);

Edit: as pointed out in comments, this is only defined for unsigned 32-bits conversions.

Upvotes: 0

Devolus
Devolus

Reputation: 22084

If you read the value as int on the same architecture it has been generated with then you don't need to do anything, as this is the natural format for your system.

You only need to do something about this if you want to read it on a different architecture, with a different binary format.

So you can read it simply with

 int32_t n;
 fread(&n, sizeof int32_t, 1, FILE);

Of course the file has to be opened in binary mode and you need a 32 bit int.

Upvotes: 1

Related Questions