首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将两个ASCII十六进制字符(两个ASCII字节)转换为一个字节

将两个ASCII十六进制字符(两个ASCII字节)转换为一个字节
EN

Stack Overflow用户
提问于 2011-08-04 04:42:27
回答 6查看 37.4K关注 0票数 3

我想把两个ASCII字节转换成一个十六进制字节。例如:

0x30 0x43 => 0x0C , 0x34 0x46 => 0x4F ...

ASCII字节是介于09之间的数字或介于AF之间的字母(仅大写),因此在0x30 ... 0x390x41 ... 0x46之间

我知道如何用数字0x340x46 : 0x4F = 0x34 * 0x10 + 0x46“构造”0x4F

因此,实际上,我会将一个ASCII字节转换为十六进制值。

为此,我可以构建和数组,将十六进制值分配给ASCII字符:

代码语言:javascript
复制
0x30 => 0x00
0x31 => 0x01
...
0x46 => 0x0F

但是,也许它有一个最“适当”的解决方案。

该程序将在AVRµC上运行,并使用avr-gcc编译,因此scanf() / printf()解决方案不适合。

你有主意了吗?谢谢

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-08-04 04:47:58

我不能理解你的例子,但是如果你想把一个包含十六进制ascii字符的字符串转换成它的字节值(例如,字符串"56“变成字节0x56,你可以使用这个(假设你的系统使用ASCII)

代码语言:javascript
复制
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;
}

你可以像这样使用它。

代码语言:javascript
复制
char x[]="1234";
uint8_t res[2];
hex_decode(x,strlen(x),res);

和res (必须至少是in参数长度的一半)现在包含2个字节0x12,0x34

还要注意的是,这段代码需要十六进制字母A-F大写,a-f不行(而且它不会做任何错误检查-所以你必须向它传递有效的内容)。

票数 11
EN

Stack Overflow用户

发布于 2011-08-04 04:45:47

您可以使用avr-libc的一部分strtol(),也可以很容易地编写您的特定案例:

代码语言:javascript
复制
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]);
}
票数 8
EN

Stack Overflow用户

发布于 2013-01-03 02:48:48

任务:

将包含十六进制ascii字符的字符串转换为其字节值,以便ascii "FF"变为0xFF,ascii "10" (x31x30x00)变为0x10

代码语言:javascript
复制
char asciiString[]="aaAA12fF";// input ascii hex string 
char result[4];               // byte equivalent of the asciiString (the size should be at half of asciiString[])

//最终结果应该是:

代码语言:javascript
复制
result[0] = 0xAA;
result[1] = 0xAA;       
result[2] = 0x12;
result[3] = 0xFF;

//1.第一步:转换asciiString,使其只包含大写:

代码语言:javascript
复制
// convert string to upper cases:
stringToUpperCases(asciiString);

使用:

代码语言:javascript
复制
void stringToUpperCases(char *p)
{   
    for(int i=0; *(p+i) !='\0'; i++)
    {
        *(p+i) = (unsigned char) toupper( *(p+i) );
    }
}

//2.将包含十六进制ascii字符的字符串转换为字节值:

代码语言:javascript
复制
// 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.打印结果:

代码语言:javascript
复制
printNrOfBytes(nrOfBytes, result);

//使用:

代码语言:javascript
复制
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.测试程序如下:

代码语言:javascript
复制
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 0xFF
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6933039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档