C++ 如何将十六进制字符串分配给char[]变量?

C++ 如何将十六进制字符串分配给char[]变量?,c++,hex,arrays,C++,Hex,Arrays,假设我的十六进制字符串hexStr=“aecf” 如何将十六进制字符串值分配给unsigned char myChar[],如下所示。谢谢 myChar[0] = 0xae; myChar[1] = 0xcf; 除非你自己解析字符串,否则没有什么神奇的方法可以将字符串文本读取为二进制。然而,在很多情况下,老式的数组文本在C的弱类型中似乎总是起作用。你是从字符串开始,然后试着将其转换为字节数组吗?如果是,请复制该字符串,每2个字符添加一个\x。字符串literal中可以有\x来表示十六进制字符,

假设我的十六进制字符串<代码>hexStr=“aecf”

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

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

除非你自己解析字符串,否则没有什么神奇的方法可以将字符串文本读取为二进制。然而,在很多情况下,老式的数组文本在C的弱类型中似乎总是起作用。

你是从字符串开始,然后试着将其转换为字节数组吗?如果是,请复制该字符串,每2个字符添加一个\x。字符串literal中可以有\x来表示十六进制字符,如中所示
myString=“\xAE\xCF”

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

    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”;
int hexsize=strlen(hexstr);
unsigned char*myChar=新的unsigned char[hexsize/2+1];
myChar[hexsize/2]='\0'
对于(inti=0,intj=0;iC-ish方式(使用std::sprintf):

#包括
/* ... */
常量字符*hexStr=“aecf”;
无符号字符myChar[3];
std::sprintf(myChar,“%02x%02x”,hexStr);

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

#包括
#包括
int main(){
std::string hexStr=“aecf”;
无符号字符myChar[2];
for(无符号i=0;i
我在搜索同样的东西,在阅读了很多之后,终于创建了这个函数

// 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);
}
//in=“63 09 58 81”
void hexatoascii(char*in,char*out,int len){
char buf[5000];
int i,j=0;
字符*数据[5000];
printf(“\n大小%d”,strlen(in));
对于(i=0;i
我的答案是一样的,但可能有人会发现它在这里很有用,一个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;
    }
#包括
#包括
int main(){
std::string myStr=“1122AA010A”;
std::stringstream-ss;
int n;
对于(inti=0;i>std::hex>>n;

但是你正在使用不同的输入字符串来更改问题。是的,确实是这样,但在我看来,这个问题更像是他试图通过套接字发送数据(因此是无符号字符类型)他需要通过线路发送的字节来匹配AE CF。这只是一个想法。
无符号字符
不仅仅用于套接字。但是,是的,我们需要知道他更广泛的目标,以便充分回答这个问题。C有一个静态弱类型系统,这正是我所指的。与Ha等强类型语言相比斯凯尔,C让你摆脱很多邪恶的东西。@John:没错。这是一种静态弱类型语言。那怎么能翻译成“无类型”呢是……令人困惑。我听到其他人这样说,这与事实并不遥远。然而,我不是狂热的C程序员,我偶尔会说一些令人不快的粗话。我的错。@John:这与事实相去甚远。:)想解释一下而不是在混搭中挖苦吗?编译器并不是以特别的类型安全著称。我相信我的答案比你认为的更有价值。
char*hexstr=“aecf”在标准C++中被禁止。已经有15年了。为什么所有的C指针都不清晰?写自己的答案。如果你看到问题,返回TUPE应该是无符号char。那么使用指针有什么困难?我有一个专业的责任指出当人们写不准确答案时。<代码> char *
既不推荐也很危险。请将
更改为
,并且不要忘记使用命名空间std;
…就是这样。它不灵活吗?是的。应该是吗?这取决于环境(固定长度记录与十六进制数字的可变长度字符串)在任何情况下,它只是一个例子。如果你知道如何使它成为C++,就可以使它成为C++,否则,它就不适合这个问题。(并且,请不要使用代码空间STD;<代码>…
#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 );
}
// 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);
}
#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;
    }