我知道有很多关于它的问题,但是大多数都使用固定大小的转换器,比如4个字节到int等。
我有一个模板化的函数来将字节转换为数字等,但有一个问题:D
template <typename IntegerType>
static IntegerType bitsToInt(BYTE* bits, bool little_endian = true)
{
IntegerType result = 0;
if (little_endian)
for (int n = sizeof(IntegerType); n >= 0; n--)
result = (result << 8) + bits[n];
else
for (int n = 0; n < sizeof(IntegerType); n++)
result = (result << 8) + bits[n];
return result;
}
template <typename IntegerType>
static BYTE *intToBits(IntegerType value)
{
BYTE result[sizeof(IntegerType)] = { 0 };
for (int i = 0; i < sizeof(IntegerType); i++)
result = (value >> (i * 8));
return result;
}
static void TestConverters()
{
short int test = 12345;
BYTE *bytes = intToBits<short int>(test);
short int test2 = bitsToInt<short int>(bytes); //<--i getting here different number, then 12345, so something goes wrong at conversion
}
那么,有人可以说这里有什么问题吗?
答案 0 :(得分:2)
static BYTE *intToBits(IntegerType value)
这是返回一个指向本地分配的内存的指针,一旦函数返回超出范围并且不再有效。
答案 1 :(得分:1)
函数intsToBits中有几个错误 1. Insted of
result = (value >> (i * 8));
应该有
result[i] = 0xFF & (value >> (i * 8));
更严重的是你将指针返回到堆栈上的内存,这在退出函数后通常是不正确的。你应该用new
运算符分配内存。
BYTE * result = new BYTE[sizeof(IntegerType)];
你需要释放内存
答案 2 :(得分:1)
这可能不是你唯一的问题,但是intToBits正在返回一个指向局部变量的指针,这是一个未定义的行为。
答案 3 :(得分:1)
尝试使用new
分配返回的字节数组