2014-02-07 54 views
3

我在尝试将char的数组转换为uint64_t,但它不起作用。 这里是我的代码:char [] to 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; 
    } 
} 
+0

它会更有意义入手的'无符号char'的数组。 –

+0

你有规格吗? Endian问题?您希望如何进行此转换?如果'sizeof(uint64_t)!= 8'怎么办? –

回答

2

假设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

这几乎是正确的。你可能只想要一个这样的循环。只是试图遵循双循环逻辑让我头痛。这不会是可读的,可维护的代码。这非常接近正确。 它有一个错误,它在或之后移动。它需要先做转变。否则,你总是将8个最低有效位设置为0,并丢失最高有效位8个。 : – m24p

+0

是的,有一个错误...只是验证ideone ...固定并感谢指出(+1)...相当尴尬! – Jimbo

+1

轻微:建议'PRIX64'更容易将'paquet'与'input'匹配。 – chux

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

那么,@Jimbo的速度更快^^“ – Coconop

+2

速度更快,但是错误 – m24p

+1

'input [0]'是类型'char',在其上执行移位不会产生大于int的任何内容 – chux

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

+1 Nice endian (注意:'(uint64_t *)“\ x1 \ x0 ...'和'*(uint64_t *)input'可能由于对齐限制而失败 – chux

+0

@chux感谢您的注意。 – BLUEPIXY