C ++我的字节数组到int和int到字节数组转换器有什么问题?

时间:2012-02-16 13:27:14

标签: c++ int byte

我知道有很多关于它的问题,但是大多数都使用固定大小的转换器,比如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
     }

那么,有人可以说这里有什么问题吗?

4 个答案:

答案 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分配返回的字节数组