C++ 不简单,从字符转换long-long[8]

C++ 不简单,从字符转换long-long[8],c++,types,C++,Types,我得到了一个具有8个位置的字符数组(字符数据[8];),这个数组上有一个无符号长整型值(大小为8字节)。。。数据[0]具有long int的第一个字节,数据[1]具有第二个字节,依此类推。 我的问题是如何在无符号长变量上再次输入该值 我尝试过移位,但值不等于原始值,如何在不更改原始数组的情况下执行此操作 字节的顺序是小端变量的正常顺序(从高位到低位) 下面是一段代码,它打印的值与预期值不同 char vec[8]={0,0,0,0,0,0,0,1}; unsigned long long va

我得到了一个具有8个位置的字符数组(字符数据[8];),这个数组上有一个无符号长整型值(大小为8字节)。。。数据[0]具有long int的第一个字节,数据[1]具有第二个字节,依此类推。 我的问题是如何在无符号长变量上再次输入该值

我尝试过移位,但值不等于原始值,如何在不更改原始数组的情况下执行此操作

字节的顺序是小端变量的正常顺序(从高位到低位)

下面是一段代码,它打印的值与预期值不同

char vec[8]={0,0,0,0,0,0,0,1};

unsigned long long value = *((unsigned long long*) vec);

std::cout<<value;

return 0;
charvec[8]={0,0,0,0,0,0,1};
无符号长值=*((无符号长*)向量);
std::cout您可以执行以下操作:

unsigned long long value = *((unsigned long long*) data);
但前提是:

  • 数据
    正确对齐,可以作为
    访问。例如,如果
    long-long
    需要8字节对齐,但
    data
    只有4字节对齐,那么它可能会做坏事
  • 数据的字节
    存储顺序与当前机器的
    long
    字节顺序相同。看

  • 假设
    数据
    数组的字节顺序与生成的
    long
    值相同

    unsigned long long ll;
    assert(sizeof ll == sizeof data);
    memcpy(&ll, data, sizeof ll);
    

    避免基于cast的解决方案。它们违反了严格的别名语义,因此不能保证工作。

    直接强制转换可能无法工作,具体取决于硬件表示,这在大多数情况下都应该有效:

    long long to_llong(unsigned char *data) {
        long long v = 0;
        for (int i = 0; i < 8; i++) {
          v = (v << 8) | data[i];
        }
        return v;
    }
    
    long-long-to-llong(无符号字符*数据){
    长v=0;
    对于(int i=0;i<8;i++){
    
    v=(v你说第一个字节是什么意思?它是最低有效字节还是最高有效字节

    这个问题的答案决定了数值是小端还是大端


    如果值的endian样式与您的系统相同,您可以直接将第一个字节的地址强制转换为“unsigned long long*”,而如果不相同,则必须转换其endian样式。

    这里解释了严格的别名,以防万一:这也不起作用,此代码的输出是72057594037927936字符数据[8]={0,0,0,0,0,0,0,1}@user1553386:正如我所说,只有在字节顺序相同的情况下,此代码才会起作用。在little endian平台和big endian平台上,您的字节数组
    数据
    表示值
    72057594037927936
    。您需要决定使用哪个平台,并相应地采取行动。问题要求未签名。此外,s签名溢出可能会有副作用。@LuchianGrigore:您如何使其不那么冗长?(但它仍然会受到对齐和结尾问题的影响。)@LuchianGrigore:您要查找的标记是--但它无论如何在注释中都不起作用。我真的想知道(所有)这种方法的缺陷。如果有人能编辑我的帖子,或者写一个包含潜在问题参考的答案,我将不胜感激。我听说过结构中的对齐,但我不知道如何在这里应用。AndreyT提到了别名问题,但在一份由SO答案链接的白皮书中,答案似乎与此无关
    无符号long-long
    值的“第一”字节可以是最高有效或最低有效。您说您“尝试了移位”;请向我们展示您的实际代码以及一些示例输入和输出。@user1553386:“Little endian”“意味着最低有效字节首先位于内存中,这意味着在数组中最低有效字节必须位于第一位。在little endian平台的内存中,值
    1
    由字节数组
    {1,0,0,0,0,0,0,0,0,0}表示。”
    。您的示例中的数组确实代表了它应该代表的
    72057594037927936
    。代码应该是这样工作的。您可能误解了little endian是什么,或者实际上需要big endian。