【问题标题】:How can I assign hex string to a char[] variable?如何将十六进制字符串分配给 char[] 变量?
【发布时间】:2011-09-05 07:55:31
【问题描述】:

假设我的十六进制字符串。 hexStr = "aecf"

如何将十六进制字符串值分配给unsigned char myChar[],如下所示。谢谢。

myChar[0] = 0xae;
myChar[1] = 0xcf;

【问题讨论】:

    标签: c++ hex arrays


    【解决方案1】:

    您可以按如下方式转换数据:

        char* hexstr="aecf";
        int hexsize=strlen(hexstr);
        unsigned char* myChar = new unsigned char[hexsize/2+1];
        myChar[hexsize/2]='\0'
        for (int i=0,intj=0;i<hexsize;i+=2,j++)
        {
            int tmp;
            sscanf(hexstr+i, "%2x",&tmp));
            myChar[j]=tmp; // warning, ignore it
        }
    

    这是在你不使用静态字符串的情况下,否则使用其他答案。

    【讨论】:

    • char* hexstr = "aecf" 在标准 C++ 中已弃用。已经有大约15年了。以及为什么所有难以辨认的 C 指针骇客?
    • 写下你自己的答案。如果你看到这个问题,返回的 tupe 应该是 unsigned char*。那么使用指针有什么问题呢?
    • 当人们写出不准确的答案时,我有责任指出。 char* hexstr = "aecf" 已被弃用且危险。
    【解决方案2】:

    您是从字符串开始,然后尝试将其转换为字节数组吗?如果是这样,请复制字符串,每 2 个字符附加一个 \x。字符串中可以包含 \x 来表示十六进制字符,如 myStringLitterial = "\xAE\xCF";

    【讨论】:

    • 但是您正在使用不同的输入字符串更改问题。
    • 是的,我确实是,但在我看来,这个问题更像是他试图通过套接字发送数据(因此是无符号字符类型),并且他需要通过网络发送的字节来匹配AE CF。只是一个想法。
    • unsigned char 不仅仅用于套接字。但是,是的,我们需要了解他更广泛的目标才能充分回答这个问题。
    【解决方案3】:
    char myChar[] = { 0xAE, 0xCF };
    

    除非你自己解析它,否则没有什么魔法可以将字符串文字读取为二进制,然而,由于 C 的弱类型化,旧时尚的数组文字似乎在很多情况下都有效。

    【讨论】:

    • C 有一个静态弱类型系统,这就是我所指的。与 Haskell 等强类型语言相比,C 可以让你摆脱很多险恶的事情。
    • @John:正确。它是一种静态弱类型语言。这怎么可能转化为“无类型”……令人费解。
    • 我听说其他人这样称呼它,这与事实相差不远。然而,我不是一个狂热的 C 程序员,而且我偶尔会做出一些不屑一顾的粗心评论。我的错。
    • @John:这与事实相去甚远。 :)
    • 愿意解释而不是讽刺吗?编译器并不以特别类型安全而闻名。我相信我的回答比你认为的更有价值。
    【解决方案4】:

    C-ish 方式(使用 std::sprintf):

    #include <cstdio>
    /* ... */
    const char *hexStr = "aecf";
    unsigned char myChar[3];
    std::sprintf (myChar, "%02x%02x", hexStr);
    

    【讨论】:

    • &lt;stdio.h&gt; 更改为 &lt;cstdio&gt; 并且不要忘记 using namespace std;... 差不多就是这样。它不灵活吗?是的。应该是吗?这取决于具体情况(固定长度记录与可变长度的十六进制数字字符串)。无论如何,这只是一个例子。
    • 如果你知道如何把它变成 C++,那就让它变成 C++!否则,它不适合这个问题。 (而且,请不要using namespace std;...呃)
    【解决方案5】:

    假设hexStr 有偶数长度并且myChar 有足够的 大小,下面的代码是否符合目的 (虽然strtol 是一个 C 函数)?

    #include <string>
    #include <cstdlib>
    
    int main() {
      std::string hexStr = "aecf";
      unsigned char myChar[2];
    
      for ( unsigned i = 0;  i < hexStr.size();  i += 2 )
        myChar[ i / 2 ] = strtol( hexStr.substr( i, 2 ).c_str(), 0, 16 );
    }
    

    【讨论】:

      【解决方案6】:

      我一直在寻找同样的东西,在阅读了很多之后,终于创建了这个功能

      // in = "63 09  58  81" 
      void hexatoascii(char *in, char* out, int len){
          char buf[5000];
          int i,j=0;
          char * data[5000];
          printf("\n size %d", strlen(in));
          for (i = 0; i < strlen(in); i+=2)
          {
              data[j] = (char*)malloc(8);
              if (in[i] == ' '){
                  i++;
              }
              else if(in[i + 1] == ' '){
                  i++;
              }
              printf("\n %c%c", in[i],in[i+1]);
              sprintf(data[j], "%c%c", in[i], in[i+1]);
              j++;
          }
          //printf("\n data %c", data);
          for (i = 0; i < j-1; i++){
              int tmp;
              printf("\n data %s", data[i] );
              sscanf(data[i], "%2x", &tmp);
              out[i] = tmp;
          }
          //printf("\n ascii value of hexa %s", out);
      }
      

      【讨论】:

        【解决方案7】:

        我重复回答了同样的问题......但可能有人会在这里发现它很有用,一个 C++ 语言

        #include <iostream>
        #include <sstream>
        
        
        int main() {
            std::string myStr = "1122AA010A";
        
            std::stringstream ss;
            int n;
            for(int i = 0; i<myStr.length(); ) {
                std::istringstream(myStr.substr(i,2))>>std::hex>>n;
                ss<<(char)n;
                i += 2;
                }
        
            std::string result = ss.str();
            //could also use ss.str().c_str() to get the c-ish result
        
            std::cout<<"\n"<<result<<"\n";
            return 0;
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-27
          • 2014-08-22
          • 2013-05-06
          • 2020-07-18
          相关资源
          最近更新 更多