我想把两个ASCII字节转换成一个十六进制字节。例如:
0x30 0x43 => 0x0C , 0x34 0x46 => 0x4F ...
ASCII字节是介于0和9之间的数字或介于A和F之间的字母(仅大写),因此在0x30 ... 0x39和0x41 ... 0x46之间
我知道如何用数字0x34和0x46 : 0x4F = 0x34 * 0x10 + 0x46“构造”0x4F
因此,实际上,我会将一个ASCII字节转换为十六进制值。
为此,我可以构建和数组,将十六进制值分配给ASCII字符:
0x30 => 0x00
0x31 => 0x01
...
0x46 => 0x0F但是,也许它有一个最“适当”的解决方案。
该程序将在AVRµC上运行,并使用avr-gcc编译,因此scanf() / printf()解决方案不适合。
你有主意了吗?谢谢
发布于 2011-08-04 04:47:58
我不能理解你的例子,但是如果你想把一个包含十六进制ascii字符的字符串转换成它的字节值(例如,字符串"56“变成字节0x56,你可以使用这个(假设你的系统使用ASCII)
uint8_t*
hex_decode(const char *in, size_t len,uint8_t *out)
{
unsigned int i, t, hn, ln;
for (t = 0,i = 0; i < len; i+=2,++t) {
hn = in[i] > '9' ? in[i] - 'A' + 10 : in[i] - '0';
ln = in[i+1] > '9' ? in[i+1] - 'A' + 10 : in[i+1] - '0';
out[t] = (hn << 4 ) | ln;
}
return out;
}你可以像这样使用它。
char x[]="1234";
uint8_t res[2];
hex_decode(x,strlen(x),res);和res (必须至少是in参数长度的一半)现在包含2个字节0x12,0x34
还要注意的是,这段代码需要十六进制字母A-F大写,a-f不行(而且它不会做任何错误检查-所以你必须向它传递有效的内容)。
发布于 2011-08-04 04:45:47
您可以使用avr-libc的一部分strtol(),也可以很容易地编写您的特定案例:
unsigned char charToHexDigit(char c)
{
if (c >= 'A')
return c - 'A' + 10;
else
return c - '0';
}
unsigned char stringToByte(char c[2])
{
return charToHexDigit(c[0]) * 16 + charToHexDigit(c[1]);
}发布于 2013-01-03 02:48:48
任务:
将包含十六进制ascii字符的字符串转换为其字节值,以便ascii "FF"变为0xFF,ascii "10" (x31x30x00)变为0x10。
char asciiString[]="aaAA12fF";// input ascii hex string
char result[4]; // byte equivalent of the asciiString (the size should be at half of asciiString[])//最终结果应该是:
result[0] = 0xAA;
result[1] = 0xAA;
result[2] = 0x12;
result[3] = 0xFF;//1.第一步:转换asciiString,使其只包含大写:
// convert string to upper cases:
stringToUpperCases(asciiString);使用:
void stringToUpperCases(char *p)
{
for(int i=0; *(p+i) !='\0'; i++)
{
*(p+i) = (unsigned char) toupper( *(p+i) );
}
}//2.将包含十六进制ascii字符的字符串转换为字节值:
// convert string to bytes:
int nrOfBytes = stringToBytes(asciiString,result);
//use:
unsigned char charToHexDigit(char c)
{
if (c >= 'A')
return (c - 'A' + 10);
else
return (c - '0');
}
unsigned char ascii2HexToByte(char *ptr)
{
return charToHexDigit( *ptr )*16 + charToHexDigit( *(ptr+1) );
}
int stringToBytes(char *string, char *result)
{
int k=0;
int strLen = strlen(string);
for(int i = 0; i < strLen; i = i + 2)
{
result[k] = ascii2HexToByte( &string[i] );
k++;
}
return k; // number of bytes in the result array
} //3.打印结果:
printNrOfBytes(nrOfBytes, result);//使用:
void printNrOfBytes(int nr, char *p)
{
for(int i= 0; i < nr; i++)
{
printf( "0x%02X ", (unsigned char)*(p+i) );
}
printf( "\n");
}//4.结果应该是:
0xAA 0xAA 0x12 0xFF
//5.测试程序如下:
char asciiString[]="aaAA12fF"; // input ascii hex string
char result[4]; // result
// convert string to upper cases:
stringToUpperCases(asciiString);
// convert string to bytes
int nrOfBytes = stringToBytes(asciiString,result);
// print result:
printNrOfBytes(nrOfBytes, result);
// result:
// 0xAA 0xAA 0x12 0xFFhttps://stackoverflow.com/questions/6933039
复制相似问题