我正在为这样的字节数组写一个整数类型:
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;如果有人能指出我在这里失踪的东西,我会感激不尽。我省略了标志位吗?我如何确保以便携方式包含它?
干杯!
答案 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个字节。