我有一个字符串,每2个字符代表一个十六进制值,例如:
unsigned char msg[] = "04FF";
我想将“04”存储在字节中,将FF存储在另一个字节中吗?
欲望输出应与此类似,
unsigned short first_hex = 0x04;
unsigned second_hex = 0xFF;
memcpy(hex_msg_p, &first_hex,1);
hex_msg_p++;
memcpy(hex_msg_p, &second_hex,1);
hex_msg_p++;
我的字符串很长,我真的想自动完成这个过程。
提前致谢
答案 0 :(得分:4)
unsigned char msg[] = { 0x04, 0xFF };
至于从字符串转换,你需要一次读取字符串,两个字符:
usigned char result;
if (isdigit(string[i]))
result = string[i]-'0';
else if (isupper(string[i]))
result = string[i]-'A';
else if (islower(string[i]))
result = string[i]-'a';
16岁,重复
答案 1 :(得分:3)
假设您的数据有效(ASCII,有效的十六进制字符,正确的长度),您应该能够做类似的事情。
unsigned char *mkBytArray (char *s, int *len) {
unsigned char *ret;
*len = 0;
if (*s == '\0') return NULL;
ret = malloc (strlen (s) / 2);
if (ret == NULL) return NULL;
while (*s != '\0') {
if (*s > '9')
ret[*len] = ((tolower(*s) - 'a') + 10) << 4;
else
ret[*len] = (*s - '0') << 4;
s++;
if (*s > '9')
ret[*len] |= tolower(*s) - 'a' + 10;
else
ret[*len] |= *s - '0';
s++;
*len++;
}
return ret;
}
这将为您提供一系列无符号字符,您负责释放这些字符。它还会将len
变量设置为大小,以便您可以轻松处理它。
它必须是ASCII的原因是因为ISO只强制数字字符是连续的。所有投注均为alphas。
答案 2 :(得分:2)
int first_hex, second_hex;
sscanf(msg,"%02X%02X", &first_hex, &second_hex);
重要提示:first_hex
和second_hex
必须属于int
类型才能像本例中一样使用。
如果我理解你,你想做以下事情:
char *pIn=msg;
char *pOut=hex_msg;
while(*pIn)
{
int hex;
if (*(pIn+1)==0)
{
// handle format error: odd number of hex digits
...
break;
}
sscanf(pIn, "%02X", &hex);
*pOut++=(char)hex;
pIn+=2;
}