从字节数组中提取整数类型

时间:2017-10-13 21:42:18

标签: c++

我正在为这样的字节数组写一个整数类型:

unsigned char Data[10]; // Example byte array
signed long long Integer = 1283318; // arbitrary value
for (int i = 0; i < NumBytes; ++i)
    Data[i] = (Integer >> (i * 8)) & 0xff; // Set the byte

在这种情况下,NumBytes是实际写入数组的字节数,可以改变 - 有时我会写一个简短的,有时是一个int等。

在我知道NumBytes == 2的测试用例中,这可以检索整数值:

signed short Integer = (Data[0] << 0) | (Data[1] << 8);

基于此,我尝试用很长的时间做同样的事情,所以它适用于任意整数类型:

signed long long Integer = 0;
for (int i = 0; i < NumBytes; ++i)
    Integer |= static_cast<signed long long>(Data[i]) << (i * 8);

但是,当Integer&lt;如果有人能指出我在这里失踪的东西,我会感激不尽。我省略了标志位吗?我如何确保以便携方式包含它?

干杯!

1 个答案:

答案 0 :(得分:1)

这有效:

#include <iostream>

using namespace std;

int main() {
    signed short Input = -288;
    int NumBytes = sizeof(signed long long);

    unsigned char Data[10]; // Example byte array
    signed long long Integer = Input; // arbitrary value
    std::cout << Integer << std::endl;
    for (int i = 0; i < NumBytes; ++i)
        Data[i] = (Integer >> (i * 8)) & 0xff; // Set the byte
    signed long long Integer2 = 0;
    for (int i = 0; i < NumBytes; ++i)
        Integer2 |= static_cast<signed long long>(Data[i]) << (i * 8);
    std::cout << Integer2 << std::endl;
    return 0;
}

当你在代码中将short变为long long时,符号位成为long long中最重要的位,这意味着正确编码/解码它需要所有8个字节。