Как я могу присвоить шестнадцатеричную строку переменной char []? - PullRequest
2 голосов
/ 31 мая 2011

Предположим, моя шестнадцатеричная строка.hexStr = "aecf"

Как назначить значение шестнадцатеричной строки для unsigned char myChar[], как показано ниже.Спасибо.

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

Ответы [ 7 ]

3 голосов
/ 31 мая 2011

Вы можете конвертировать данные следующим образом:

    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
    }

это в том случае, если вы не используете статические строки, в противном случае используйте другие ответы.

2 голосов
/ 31 мая 2011

Вы начинаете со строки, а затем пытаетесь преобразовать ее в байтовый массив?Если это так, скопируйте строку, добавив \ x для каждых 2 символов.Строковые литералы могут содержать \ x для обозначения шестнадцатеричного символа, как в myStringLitterial = "\ xAE \ xCF";

1 голос
/ 31 мая 2011
char myChar[] = { 0xAE, 0xCF };

Нет волшебства, которое делает строковый литерал читаемым как двоичный, если вы не проанализируете его самостоятельно, однако есть литералы массива старой моды, которые, учитывая слабую типизацию Си, всегда работают во многих ситуациях.

0 голосов
/ 11 января 2015

Я ответил так же в двух экземплярах ... но, может быть, кто-то найдет это полезным здесь, C ++ ish

#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;
    }
0 голосов
/ 13 августа 2014

Я искал то же самое и, прочитав много, наконец-то создал эту функцию

// 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);
}
0 голосов
/ 31 мая 2011

Предполагая, что 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 );
}
0 голосов
/ 31 мая 2011

C-ish way (используя std :: sprintf):

#include <cstdio>
/* ... */
const char *hexStr = "aecf";
unsigned char myChar[3];
std::sprintf (myChar, "%02x%02x", hexStr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...