Reputation: 3495
I a writing a routine to append bytes to a byte_array like so
unsigned long speed = 0xfeb;
char byteArray[8];
bzero(byteArray,8); //fills every of the 8 bytes with zero
memcpy(byteArray,&speed ,4); //copies 4 bytes from speed to byteArray
After the operation i am expecting byteArray to have the value 0xfeb
but it turns out that byteArray has the value 0xebf
What is happening ? is it normal for memcpy to force the result to little-endianness ? What should i do to get the result without the change of endianness ?
Upvotes: 2
Views: 21569
Reputation: 74098
memcpy
just copies bytes and doesn't care about endianness:
Copies count bytes from the object pointed to by src to the object pointed to by dest. Both objects are reinterpreted as arrays of unsigned char.
If you're on a little-endian machine it will copy LSB first. On a big-endian machine it will copy MSB first, and you will get the expected 0x0f 0xeb
.
Unrelated, but you shouldn't use hard-coded values, but rather sizeof
, e.g.
unsigned long speed = 0xfeb;
char byteArray[sizeof(speed)];
bzero(byteArray, sizeof(byteArray));
memcpy(byteArray, &speed , sizeof(speed));
Upvotes: 12
Reputation: 234875
memcpy
does exactly what it says on the tin: it copies memory. It does not mess about with the ordering of bytes.
Endianness is only relevant if you want to know how a particular bit pattern maps to the value of the integral type. Folk tend to blame endianness for all sorts of things: in the majority of occasions it has a benign effect, and that's the case here.
Upvotes: 2