C 字符[]到uint64\u t

C 字符[]到uint64\u t,c,binary,char,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 &l

我正在尝试将
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;
    }
}
char输入[8];
//输入的初始化
int i,j;
uint64_t paquet=0;
对于(i=0;i<8;i++)
{
对于(j=0;j<8;j++)
{
paquet+=(输入[i]>>j)&0x01;

paquet=paquet假设
输入
缓冲区以一种小的表示形式存储了数据,这意味着最低有效字节位于最低地址,最高有效字节位于最高地址,那么您可以执行以下操作

#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;
}
#包括
#定义\u STDC\u格式\u宏
#包括
内部主(空)
{
int i;
无符号字符输入[8]={0x01、0x02、0x03、0x04、0x5、0x06、0x07、0x08};
uint64_t paquet=0;
对于(i=7;i>=0;--i)
{
帕奎特也许是这个

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];
uint64\u t paquet=input[0]
char input[8]=“\x01\x23\x45\x67\x89\xAB\xCD\xEF”;
uint64\u t paquet=*(uint64\u t*)“\x1\x0\x0\x0\x0\x0\x0”;
如果(paquet==1){
//逆转
char*f=&input[0],*b=&input[7];

while(fIt)从一个
无符号字符数组开始会更有意义。您是否有规范?Endian问题?您希望如何进行此转换?如果
sizeof(uint64\t)怎么办!=8
?这几乎是对的。你可能只想要一个这样的单循环。仅仅尝试遵循两个循环逻辑就让我头疼。那不是可读的、可维护的代码。这非常接近正确。它有一个错误,它在or之后移动。它需要在or之前移动。否则,你总是会使用h将8个最低有效位保留在0,并丢失前8个最高有效位。注意:是的,有一个错误…只是在ideone上验证…修复了,感谢您指出(+1)…非常尴尬!次要:建议
PRIX64
更容易地将
paquet
匹配到
input
input[0]
类型为
char
。对其执行移位不会导致任何大于
int
+1的良好endian检测。(注意:
(uint64_t*)“\x1\x0…
*(uint64_t*)输入可能由于对齐限制而失败。
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));