首页 文章

不简单,从长焦转换长[8]

提问于
浏览
2

我得到了一个包含8个位置的char数组(char数据[8];),这个数组上有一个无符号长long int值(8个字节大小)... data [0]有long long的第一个字节int,data [1]有第二个,依此类推 . 我的问题是如何将该值再次放在unsigned long long变量上?

我试过班次,但 Value 不等于原始值,我怎么能这样做而不改变原来的数组......

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

这是一个打印不同于预期值的代码 .

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

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

std::cout<<value;

return 0;

结果应该是一个,而是72057594037927936.感谢您的耐心等待 .

4 回答

  • 1

    假设 data 数组的字节顺序与结果 long long 值相同

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

    避免基于铸造的解决方案 . 它们违反了严格别名的语义,因此无法保证工作 .

  • 4

    根据硬件表示,直接强制转换可能不起作用,这在大多数情况下都适用:

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

    你可以做:

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

    但这假定:

    • data 已正确对齐以作为 long long 进行访问 . 例如,如果 long long 需要8字节对齐但 data 只有4字节对齐,那么它可以做坏事 .

    • data 的字节存储顺序与当前机器 long long 的字节顺序相同 . 见Endianness .

  • 1

    说第一个字节是什么意思?它是最不重要的字节还是最重要的字节?

    该问题的答案决定数值是小端还是大端 . wikipedia link

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

相关问题