I'm trying to convert an array of char
into a uint64_t
but it doesn't work. Here's my code :
char input[8];
//Initialisation of input
int i,j;
uint64_t paquet=0;
for(i = 0; i < 8; i++)
{
for(j = 0; j < 8; j++)
{
paquet+= (input[i] >> j) & 0x01;
paquet = paquet << 1;
}
}
Assuming that the input
buffer has stored the data in a little endian representation, which means that the least significant byte is at the lowest address and the most significant byte at the highest address then you can do something like the following.
#include <stdio.h>
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
int main(void)
{
int i;
unsigned char input[8] = {0x01, 0x02, 0x03, 0x04, 0x5, 0x06, 0x07, 0x08 };
uint64_t paquet = 0;
for( i = 7; i >= 0; --i )
{
paquet <<= 8;
paquet |= (uint64_t)input[i];
}
printf("0x%" PRIx64 "\n", paquet);
return 0;
}
You can see the working example on ideone .
If the buffer is stored in big endian mode then reverse the loop.
Thank you to m24p for pointing out a bug in my initial draft.
Maybe this ?
uint64_t paquet = input[0]<<(8*7) | input[1]<<(8*6)
| input[2]<<(8*5)
| input[3]<<(8*4)
| input[4]<<(8*3)
| input[5]<<(8*2)
| input[6]<<(8*1)
| input[7];
char input[8] = "\x01\x23\x45\x67\x89\xAB\xCD\xEF";
uint64_t paquet = *(uint64_t*)"\x1\x0\x0\x0\x0\x0\x0\x0";
if(paquet == 1){
//reverse
char *f=&input[0], *b=&input[7];
while(f<b){
char tmp = *f;
*f++ = *b;
*b-- = tmp;
}
}
paquet = *(uint64_t*)input;//memcpy(&paquet, input, sizeof(input));
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.