char []到uint64_t

时间:2014-02-07 15:45:50

标签: c binary char

我正在尝试将char数组转换为uint64_t,但它不起作用。 这是我的代码:

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;
    }
}

3 个答案:

答案 0 :(得分:3)

假设input缓冲区以小endian表示存储数据,这意味着最低有效字节位于最低地址,最高有效字节位于最高地址,那么您可以做类似以下的事情。

#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;
}

您可以在ideone上看到工作示例。

如果缓冲区以big endian模式存储,则反转循环。

感谢m24p指出我的初稿中的错误。

答案 1 :(得分:2)

也许这个?

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];

答案 2 :(得分:2)

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));