endianness - C/C++ code to convert big endian to little endian -


i've seen several different examples of code converts big endian little endian , vice versa, i've come across piece of code wrote seems work, i'm stumped why does.

basically, there's char buffer that, @ position, contains 4-byte int stored big-endian. code extract integer , store native little endian. here's brief example:

char test[8] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; char *ptr = test; int32_t value = 0; value =  ((*ptr) & 0xff)       << 24; value |= ((*(ptr + 1)) & 0xff) << 16; value |= ((*(ptr + 2)) & 0xff) << 8; value |= (*(ptr + 3)) & 0xff; printf("value: %d\n", value); 

value: 66051

the above code takes first 4 bytes, stores little endian, , prints result. can explain step step how works? i'm confused why ((*ptr) & 0xff) << x wouldn't evaluate 0 x >= 8.

this code constructing value, 1 byte @ time.

first captures lowest byte

 (*ptr) & 0xff 

and shifts highest byte

 ((*ptr) & 0xff) << 24 

and assigns 0 initialized value.

 value =((*ptr) & 0xff) << 24 

now "magic" comes play. since ptr value declared char* adding 1 advances pointer 1 character.

 (ptr + 1) /* next character address */  *(ptr + 1) /* next character */ 

after see using pointer math update relative starting address, rest of operations same ones described, except preserve partially shifted values, or values existing value variable

 value |= ((*(ptr + 1)) & 0xff) << 16 

note pointer math why can things like

 char* ptr = ... value ...   while (*ptr != 0) {      ... ...      ptr++;  } 

but comes @ price of possibly messing pointer addresses, increasing risk of segfault violation. languages saw such problem, removed ability pointer math. almost-pointer cannot pointer math on typically called reference.


Comments

Popular posts from this blog

node.js - Node js - Trying to send POST request, but it is not loading javascript content -

javascript - Replicate keyboard event with html button -

javascript - Web audio api 5.1 surround example not working in firefox -