【问题标题】:Extracting certain hex values from a string to a new string从字符串中提取某些十六进制值到新字符串
【发布时间】:2017-04-25 00:37:39
【问题描述】:

我有一个十六进制 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 循环的工作,例如位移或类似?

【问题讨论】:

  • 显示您尝试过的内容。
  • 输出仍然是字符串还是您也想解析它?你是否允许_pext_u32_mm_shuffle_epi8 之类的东西?
  • 这毫无意义。 0x30303f3f 不是0x00ff0x3f3f3f3f 不是0xffff
  • 你需要一个值而不是四个。你可以做` union { char w[4];单位吨; } h;
  • 如果你不知道 "

标签: c bitmap hex bit-manipulation bit


【解决方案1】:

我想知道是否有任何方法可以更快地完成 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)。

【讨论】:

    【解决方案2】:

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

    #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】:
      final_result=source<<4 & 0xf0000000+source<<8 & 0x0f000000+source<<12 & 0x00f00000+source<<16 & 0x000f0000 ;
      final_result>>=16;
      

      【讨论】:

        【解决方案4】:
        char inData[] = "0x30303f3f";
        char outData[7] = "0x";
        outData[2] = inData[3];
        outData[3] = inData[5];
        outData[4] = inData[7];
        outData[5] = inData[9];
        

        【讨论】:

          猜你喜欢
          • 2010-10-04
          • 1970-01-01
          • 2014-03-07
          • 2017-12-02
          • 1970-01-01
          • 2016-02-26
          • 2017-03-04
          • 2022-01-25
          • 1970-01-01
          相关资源
          最近更新 更多