将字符串中的某些十六进制值提取到新字符串

时间:2016-12-09 13:53:28

标签: c bitmap hex bit-manipulation bit

我有一个十六进制ASCII格式的字符串[3x3x3x3x],变量x,x-(0 ... F)。

例如,我可以获取数据

inData = 0x30303f3f并希望将其转换为:

outData = 0x00ff

inData = 0x3f3f3f3f

outData = 0xffff

如何在这里进行位操作的最佳方法,我真的只想跳过" 3s"?

// receive answer from device
if (ReceiveMsg(FLog, TLog::INFO, FSerial, &ReceiveStr))
{
    int side;
    char inData[4];
    char serial[6];
    char status;

    if (sscanf(ReceiveStr.GetData(), "\x2%6s\x84%1d%4c%c", &serial, &side, &inData, &status) == 4) {

        *Status = status & 0x0f;

        // decode hex ASCII
        int time = 0;
        int j = 0;
        for (int i = 3; i >= 0; i--) {
            time = time + ((inData[i] & 0x0f) *(pow(16, j)));
            j++;
        }
        *Timer = time;
        result = true;
    }
}
  • inData [4] = 0x30,0x30,0x3f,0x3f
  • 时间= 255(输出)

我想知道是否有任何方法可以更快地完成for循环的操作,比如位移或类似的东西?

4 个答案:

答案 0 :(得分:0)

char inData[] = "0x30303f3f";
char outData[7] = "0x";
outData[2] = inData[3];
outData[3] = inData[5];
outData[4] = inData[7];
outData[5] = inData[9];

答案 1 :(得分:0)

final_result=source<<4 & 0xf0000000+source<<8 & 0x0f000000+source<<12 & 0x00f00000+source<<16 & 0x000f0000 ;
final_result>>=16;

答案 2 :(得分:0)

您指的是二进制数据,例如来自二进制文件的数据或内存中的数据。此数据可以十六进制格式表示为字符串:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    unsigned char data[] = { 0x30, 0x30, 0x3F, 0x3F };
    int data_size = sizeof(data) / sizeof(data[0]);

    char *str = malloc(data_size * 2 + 1);
    int i;
    for(i = 0; i < data_size; i++)
        sprintf(&str[i * 2], "%02X", data[i]);
    str[i * 2] = 0;
    printf("%s\n", str);
    return 0;
}

结果为"30303F3F"

或者数据可以存储在字符串中,但这并不常见。

int main()
{
    const char *data = "0123456789";
    int data_size = strlen(data);

    char *str = malloc(data_size * 2 + 1);
    int i;
    for(i = 0; i < data_size; i++)
        sprintf(&str[i * 2], "%02X", data[i]);
    str[i * 2] = 0;
    printf("%s\n", str);

    return 0;
}

结果:"30313233343536373839"

请注意,0是一个字符,其值为0x30,而10x31等。这就是所有这些3来的地方从

答案 3 :(得分:0)

  

我想知道是否有任何方法可以更快地完成for循环……

您拥有char数组:

  
      
  • inData [4] = 0x30、0x30、0x3f,0x3f
  •   

您想要一个int

  
      
  • 时间= 255(输出)
  •   

实际上,您可以展开循环

            time = 0;
        int j = 0;
        for (int i = 3; i >= 0; i--) {
            time = time + ((inData[i] & 0x0f) *(pow(16, j)));
            j++;
        }

        time = inData[0]-48<<12|inData[1]-48<<8|inData[2]-48<<4|inData[3]-48;

(同时使用可能更便宜的移位操作,而不是pow)。