我有一个传感器,将记录的信息存储为.pcap文件。我已设法将文件加载到unsigned char数组中。传感器以独特的格式存储信息。例如,表示角度为290.16,它将信息存储为0x58 0x71的二进制等效值。
为了获得正确的角度,我必须做的是连接0x71和0x58,然后将得到的十六进制值转换为十进制除以100,然后存储它以供进一步分析。我目前的做法是:
//all header files are included
main
{
unsigned char data[50]; //I actually have the data loaded in this from a file
data[40] = 0x58;
data[41] = 0x71;
// The above maybe incorrect. What i am trying to imply is that if i use the statement
// printf("%.2x %.2x", data[40],data[41]);
// the resultant output you see on screen is
// 58 71
//I get the decimal value i wanted using the below statement
float gar = hex2Dec(dec2Hex(data[41])+dec2Hex(data[40]))/100.0;
}
hex2Dec和dec2Hex是我自己的函数。
unsigned int hex2Dec (const string Hex)
{
unsigned int DecimalValue = 0;
for (unsigned int i = 0; i < Hex.size(); ++i)
{
DecimalValue = DecimalValue * 16 + hexChar2Decimal (Hex[i]);
}
return DecimalValue;
}
string dec2Hex (unsigned int Decimal)
{
string Hex = "";
while (Decimal != 0)
{
int HexValue = Decimal % 16;
// convert deimal value to a Hex digit
char HexChar = (HexValue <= 9 && HexValue >= 0 ) ?
static_cast<char>(HexValue + '0' ) : static_cast<char> (HexValue - 10 + 'A');
Hex = HexChar + Hex;
Decimal = Decimal /16;
}
return Hex;
}
int hexChar2Decimal (char Ch)
{
Ch= toupper(Ch); //Change the chara to upper case
if (Ch>= 'A' && Ch<= 'F')
{
return 10 + Ch- 'A';
}
else
return Ch- '0';
}
痛苦在于我必须做数十亿次转换才能真正减慢这个过程。有没有其他有效的方法来处理这个案子?
我的朋友为类似的传感器开发的一个matlab代码,花了他3个小时来提取实时值仅1分钟的数据。我真的需要它尽可能快。
任何帮助表示赞赏。谢谢。
答案 0 :(得分:1)
据我所知,这和
一样float gar = ((data[45]<<8)+data[44])/100.0;
有关:
unsigned char data[50];
data[44] = 0x58;
data[45] = 0x71;
gar
的值为290.16
。
说明:
没有必要将整数的值转换为字符串以获取十六进制值,因为十进制,十六进制,二进制等只是相同值的不同表示。 data[45]<<8
将data[45]
八位的值向左移动。在执行操作之前,操作数的类型将提升为int
(除了可能为unsigned int
的一些异常实现),因此新数据类型应足够大以不溢出。向左移8位相当于以十六进制表示向左移2位。结果是0x7100
。然后将data[44]
的值添加到该值,您将获得0x7158
。然后,类型int
的结果会转换为float
并除以100.0
。
一般来说,int
可能太小而无法移动符号,如果它只有16位长,则可以应用移位操作。如果您想覆盖该案例,请明确转换为unsigned int
:
float gar = (((unsigned int)data[45]<<8)+data[44])/100.0;
答案 1 :(得分:0)
在这里C convert hex to decimal format,Emil H. 发布了一些看起来与你想要的非常相似的示例代码。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *hex_value_string = "deadbeef";
unsigned int out;
sscanf(hex_value_string, "%x", &out);
printf("%o %o\n", out, 0xdeadbeef);
printf("%x %x\n", out, 0xdeadbeef);
return 0;
}
您的转换功能看起来效率不高,所以希望这更快。