连接单个字符并转换为c ++中的组合小数

时间:2014-02-26 19:04:17

标签: c++ hex decimal concatenation

我有一个传感器,将记录的信息存储为.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分钟的数据。我真的需要它尽可能快。

任何帮助表示赞赏。谢谢。

2 个答案:

答案 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]<<8data[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;
}

您的转换功能看起来效率不高,所以希望这更快。