char数据为float / double

时间:2016-01-26 18:49:02

标签: c++ type-conversion

我有128字节的内存位置。我尝试用1 ... 127开始的数据填充内存。

我需要编写一个代码来获取像offset,data type这样的两个参数。基于我需要将内存上的数据转换为所提到的特定数据类型的参数。

比如说

unsigned char *pointer = (unsigned char *)malloc(sizeof(unsigned char) * 128);
printf("\n\n loading some default values...");
        for (unsigned int i = 0; i < 128; i++) {
            pointer[i] = i + 1;
        }

convertTo(3,efloat);
convertTo(100,edword);    

void convertTo(uint8_t offset, enum datatype){

   switch(datatype)
   {
      case efloat:
       //// conversion code here..
       break;

case edword:
       //// conversion code here..
       break;

case eint:
       //// conversion code here..
       break;

   }
}

我尝试过使用atoi,atof,strtod,strtol等许多方法,但没有什么能给我正确的价值。假设我将偏移量设为2,eint(16位),它应该取值2,3并给出515

2 个答案:

答案 0 :(得分:1)

试试cin>>ans; while((ans !='N')||(ans !='n')) { return main(); } return 0; } 。当然,您将获得的内容取决于系统的endianess。 0x02 0x03可能被解释为0x0203(515)或0x0302(770)。

答案 1 :(得分:1)

这是您想要的类型的通用版本,它包含要转换的类型以及偏移到单个结构中。虽然模板代码更复杂,但使用方法是恕我直言,更清洁。此外,已删除long switch语句(以一些不太可读的模板代码为代价)。

// Use an alias for the type to convert to (for demonstration purposes)
using NewType = short;

// Struct which wraps both the offset and the type after conversion "neatly"
template <typename ConversionType>
struct Converter {
  // Define a constructor so that the instances of 
  // the converter can be created easily (see main)
  Converter(size_t offset) : Offset(offset) {}

  // This provides access to the type to convert to
  using Type = ConversionType;

  size_t Offset;
};

// Note: The use of the typename keyword here is to let the compiler know that 
// ConverterHelper::Type is a type
template <typename ConverterHelper>
typename ConverterHelper::Type convertTo(char* Array, ConverterHelper ConvHelper) {
  // This converts the bytes in the array to the new type
  typename ConverterHelper::Type* ConvertedVar = 
    reinterpret_cast<typename ConverterHelper::Type*>(Array + ConvHelper.Offset); 

  // Return the value of the reinterpreted bytes
  return *ConvertedVar;
}

int main()
{
  char ExampleArray[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};

  // Create a new NewType (short) using bytes 1 and 2 in ExampleArray
  NewType x = convertTo(ExampleArray, Converter<NewType>(1));
}

在我曾经测试过的机器上,x的值为770,正如John所说的那样。

如果删除别名NewType并使用您希望转换为的实际类型,convertTo的意图再次恕我直言,非常清楚。

这是一个现场演示Coliru Demo。只需更改类型别名NewType即可查看不同类型的输出。