【问题标题】:Binary Char to Hex Conversion in CC中的二进制字符到十六进制转换
【发布时间】:2013-08-13 04:08:24
【问题描述】:

我正在查看一个由 Tibor Kiss 创建的简单 C 函数(链接如下)。我试图了解将单个二进制字节转换为两个十六进制字符如何涉及添加“W”(0x57)。为什么要这样做?

我知道 >> 将字符 c 向右移动了四个位置(用 0 填充左侧位)。我也理解 x=c&0x0f 部分,它只是使用按位与屏蔽 x 的高四位。

我只是不知道为什么将二进制字节转换为十六进制会涉及添加 ASCII 'W' (0x57)。

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en543105

/******************************************************************************
 * Function:        void btoh(unsigned char c,char *str)
 *
 * PreCondition:    None
 *
 * Input:           str - pointer to the zero terminated string
 *                  c   - byte to convert
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Convert one byte to a 2 character length hexadecimal
 *                  zero terminated string
 *
 * Note:            Using static variable for less code size
 *****************************************************************************/
void btoh(unsigned char c,char *str)
{
    static unsigned char x;
    x=c>>4;
    *str=x+(x>9?'W':'0');
    x=c&0x0f;
    str[1]=x+(x>9?'W':'0');
    str[2]=0;
}

【问题讨论】:

  • 'W' 是 ASCII 码 87(10) , 87 + 10 = 97('a')
  • @BLUEPIXY 别喊。

标签: c string binary hex


【解决方案1】:

他之所以加'W',是为了简化这个表达式:

*str=x+(x>9? ('a'-10) :'0');

他观察到'W''a'-10,并将简化后的常量输入到他的代码中。这不是一个好主意,因为如果不查看 ASCII 表就很难理解发生了什么。此外,编译器将'a'-10 表达式简化为相同的精确值,因此可读性丢失,没有任何特别的好处。

【讨论】:

  • 刚刚想通了。为什么会有人这样做?
  • @H2CO3 这不是不常见的方式。
  • @KeithNicholas 我的意思是,'a' - 10 是一个常量表达式。如果我的编译器没有将其优化为文字 0x57,我会立即将其弹出到外层空间。
  • @H2CO3 您可能需要澄清最后一个“it”指的是您的编译器,而不是文字:-)
  • @H2CO3 为什么,外太空到处都是糟糕的编译器:-)
【解决方案2】:

如果 c 是 (H1H2H3H4L1L2L3L4) ,str[0] 有 0000H1H2H3H4 ,而 str[1] 有 0000L1L2L3L4

+ '0'                                             ANSI

0000 0*** + 0011 0000 = 0011 0****  0  -->  0x30   0
                                    1  -->  0x31   1
                                    2  -->  0x32   2
                                       ...
+'W'                                               ANSI
00001011 + 0101 0111 =  0110 0010   B  -->  0x62  -->b
00001100 + 0101 0111 =  0110 0011   C  -->  0x63  -->c
00001010 + 0101 0111 =  0110 0001   A  -->  0x61  -->a
00001101 + 0101 0111 =  0110 0100   D  -->  0x64  -->d
00001111 + 0101 0111 =  0110 0110   F  -->  0x66  -->f
00001110 + 0101 0111 =  0110 0101   E  -->  0x65  -->e

所以他只是转身

                0x12 to '1''2'0
                0xAB to 'a''b'0

【讨论】:

    猜你喜欢
    • 2012-01-24
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2015-05-26
    • 2010-11-17
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多