我有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
答案 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即可查看不同类型的输出。