将字符数组转换为无符号64位整数

3

我正在尝试将一个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;
    }
}

最好从一个“unsigned char”数组开始会更合理。 - Keith Thompson
你有规格说明吗?大小端问题怎么处理?你希望如何进行转换?如果 sizeof(uint64_t) != 8 怎么办? - David Heffernan
3个回答

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上看到工作示例。
如果缓冲区以大端模式存储,则需要反转循环。
感谢m24p指出我的初稿中的错误。

1
这几乎是正确的。你可能只需要像这样一个单循环。试图遵循双循环逻辑只会让我头疼。那不是可读性好、可维护性强的代码。这非常接近正确。它有一个错误,即在或之后进行了移位。它需要在移位之前进行。否则,你总是会有8个最低有效位为0,并且失去8个最高有效位。 - m24p
是的,有一个 bug......只是在 ideone 上验证一下......已经修复了,感谢您指出(+1)......感到相当尴尬! - Jimbo
1
建议使用PRIX64来更轻松地将paquetinput匹配。 - chux - Reinstate Monica

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

3
input[0]char 类型。进行位移操作不会导致结果大于 int - chux - Reinstate Monica

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

2
+1 很好的字节序检测。(注意:(uint64_t*)"\x1\x0...*(uint64_t*)input 可能由于对齐限制而失败。) - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接