2012-02-16 33 views
1

我知道有很多关于它的问题,但其中大多数使用固定大小的转换器,如4个字节到int等。
我有一个模板化的函数将字节转换为数字等,但有一个问题: D
C++我的字节数组到int和int到字节数组转换器有什么问题?

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

我还没有检查整个事情,但对于(int n = sizeof(IntegerType); n> = 0; n--) 应该可能读为(int n = sizeof(IntegerType)-1; n > = 0; n--) – Hybrid 2012-02-16 13:30:08

+2

你使用什么编译器? 'result =(value >>(i * 8));'不应该编译。你也应该尝试启用警告...... – PlasmaHH 2012-02-16 13:31:56

+0

intToBits是如何编译的,当它试图给常量指针'result'赋值一个新值时?不应该是结果[i] = ...? – Hybrid 2012-02-16 13:33:31

回答

1

有在功能intsToBits几个错误 1. insted的

result = (value >> (i * 8)); 

应该有

result[i] = 0xFF & (value >> (i * 8)); 

更严重的一个,你的指针返回到存储堆栈,这是在退出该功能后通常不正确。您可以使用new运营商分配内存。将需要

BYTE * result = new BYTE[sizeof(IntegerType)]; 

的你来释放内存

+0

谢谢!现在工作正常 – Kosmos 2012-02-16 13:43:35

+0

还有一件事,现在我需要使用delete来释放内存,但是我不能在intToBits中使用它,因为没有什么可以返回的,那么使用删除字节是正确的;在TestConverners的结尾? – Kosmos 2012-02-16 13:46:39

+0

@ Kosmos:是的,在那里删除它是“正确的”,但是在功能中分配某些东西并迫使用户关心它是一种不好的做法。主要是因为用户**必须首先知道你如何分配内存。最好或者返回一个智能指针('std :: unique_ptr')或者一个'std :: vector'(按值)。 – ereOn 2012-02-16 14:34:06

1

这可能不是你的唯一的问题,但intToBits返回一个指向一个局部变量,这是不确定的行为。

1

尝试使用new分配的字节数组返回

2
static BYTE *intToBits(IntegerType value) 

此函数返回一个指针,本地分配内存,一旦函数返回超出范围,不再有效。