【发布时间】:2011-09-05 07:55:31
【问题描述】:
假设我的十六进制字符串。 hexStr = "aecf"
如何将十六进制字符串值分配给unsigned char myChar[],如下所示。谢谢。
myChar[0] = 0xae;
myChar[1] = 0xcf;
【问题讨论】:
假设我的十六进制字符串。 hexStr = "aecf"
如何将十六进制字符串值分配给unsigned char myChar[],如下所示。谢谢。
myChar[0] = 0xae;
myChar[1] = 0xcf;
【问题讨论】:
您可以按如下方式转换数据:
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 指针骇客?
char* hexstr = "aecf" 已被弃用且危险。
您是从字符串开始,然后尝试将其转换为字节数组吗?如果是这样,请复制字符串,每 2 个字符附加一个 \x。字符串中可以包含 \x 来表示十六进制字符,如 myStringLitterial = "\xAE\xCF";
【讨论】:
unsigned char 不仅仅用于套接字。但是,是的,我们需要了解他更广泛的目标才能充分回答这个问题。
char myChar[] = { 0xAE, 0xCF };
除非你自己解析它,否则没有什么魔法可以将字符串文字读取为二进制,然而,由于 C 的弱类型化,旧时尚的数组文字似乎在很多情况下都有效。
【讨论】:
C-ish 方式(使用 std::sprintf):
#include <cstdio>
/* ... */
const char *hexStr = "aecf";
unsigned char myChar[3];
std::sprintf (myChar, "%02x%02x", hexStr);
【讨论】:
<stdio.h> 更改为 <cstdio> 并且不要忘记 using namespace std;... 差不多就是这样。它不灵活吗?是的。应该是吗?这取决于具体情况(固定长度记录与可变长度的十六进制数字字符串)。无论如何,这只是一个例子。
using namespace std;...呃)
假设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 );
}
【讨论】:
我一直在寻找同样的东西,在阅读了很多之后,终于创建了这个功能
// 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);
}
【讨论】:
我重复回答了同样的问题......但可能有人会在这里发现它很有用,一个 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;
}
【讨论】: