【问题标题】:Conversion from byte (binary) to ASCII in C在 C 中从字节(二进制)转换为 ASCII
【发布时间】:2013-12-07 18:15:58
【问题描述】:

我正在使用 PIC 微处理器,我需要将值从 AD 转换器发送到终端(在本例中为超级终端)。现在,终端只能理解 ASCII。 AD 转换器给出的值是单个字节(范围从 0 到 255)。这个二进制数怎么转换成ASCII码?

为了完全清楚,字节是二进制的。所以0100 0000 应该是64。当然这意味着需要向电脑发送 2 个 ASCII 数字。

编辑: 显然我在这里并不完全清楚。我还需要二进制数的 ASCII 码,以便我可以通过芯片制造商提供的 USB 模板发送它。

编辑 2: 在深入研究其他主题后,this 的回答让我尝试了itoa()utoa()。现在,itoa() 有效,但不幸的是,它适用于未签名的字符。 utoa() 将用于无符号字符,但这不起作用。下面是一个应该能够发生的例子:

char USB_In_Buffer[64];
char myValue = 0x55;

itoa(myValue, USB_In_Buffer);
putUSBUSART(USB_In_Buffer, 3);

所以每个 ASCII 字符都应该发送到USB_In_Buffer。然后写入此缓冲区的字符总数应用作putUSBUSART() 中的第二个参数。我也只需要将数字转换为 ASCII,所以不需要实现整个字符集。

编辑 3:因为某些自动化功能似乎不受支持,所以我认为制作自己的功能不会那么难。

if(ADCONvalue/100 != 0){
    res++;
    USB_In_Buffer[0] = (ADCONvalue / 100) + 0x30;
}
if(ADCONvalue/10 != 0){
    res++;
    if(res == 1){
        USB_In_Buffer[0] = (ADCONvalue / 10) + 0x30;
    }else{
        USB_In_Buffer[1] = (ADCONvalue / 10) + 0x30;
    }   

}
res++;
if(res == 1){
    USB_In_Buffer[0] = ADCONvalue % 10 + 0x30;
}else if(res == 2){
    USB_In_Buffer[1] = ADCONvalue % 10 + 0x30;
}else{
    USB_In_Buffer[2] = ADCONvalue % 10 + 0x30;
}
putUSBUSART(USB_In_Buffer, res);

但似乎某处有错误。小数字确实有效 (0-99),但由于某种原因,当应该有 121 时,它会显示 1<1。对于较大的数字,所有字符都是非数字的。

编辑 4: 重新检查我的代码后,我发现了错误。例如,ADCONvaluechar,而不是 unsigned char。我也忘了做%10 的十分之一。当前工作代码:

if(ADCONvalue/100 != 0){
    res++;
    USB_In_Buffer[0] = (ADCONvalue / 100) + 0x30;
}
if(ADCONvalue/10 != 0){
    res++;
    if(res == 1){
        USB_In_Buffer[0] = (ADCONvalue / 10)%10 + 0x30;
    }else{
        USB_In_Buffer[1] = (ADCONvalue / 10)%10 + 0x30;
    }   

}
res++;
if(res == 1){
    USB_In_Buffer[0] = ADCONvalue % 10 + 0x30;
}else if(res == 2){
    USB_In_Buffer[1] = ADCONvalue % 10 + 0x30;
}else{
    USB_In_Buffer[2] = ADCONvalue % 10 + 0x30;
}
putUSBUSART(USB_In_Buffer, res);

【问题讨论】:

  • 请注意:超级终端不使用 ASCII;它使用用户默认代码页(例如,Windows-1252)。当然,您可能使用的任何字符集都是 ASCII 的超集,共享字符具有相同(8 位)编码。
  • 请看我的更新答案。

标签: c byte pic


【解决方案1】:

构建一个IntToHex() 辅助函数。

static char IntToHex(unsigned x) {
  x &= 15;
  if (x <= 9) return x + '0';
  return x - 10 + 'A';
  }

unsigned char ADConverter;
char s[3];
s[0] = IntToHex(ADConverter >> 4);
s[1] = IntToHex(ADConverter);
s[2] = '\0';
send(s);

反面见hexadecimal ASCII chars conversion

【讨论】:

    【解决方案2】:

    您可能想查看printf() 系列函数。

    char str[32] = "";
    unsigned char byte = 42;
    snprintf(str, sizeof(str), "%hhu", byte); 
    printf("'%s'", str); /* This is a debug statement to check what's be placed in str. */
    

    打印出来

    '42'
    

    更新指的是OP更新中提到的“发送”功能:

    在使用上面的snprintf()byte 的整数值转换为其字母数字表示后,可以将其放置在发送缓冲区中:

    putUSBUSART(str, strlen(str));
    

    【讨论】:

    • 如果有的话,请首选snprintf()
    • 我想知道printf family 是否可以在他的微控制器上使用。
    • 但是printfsnprintf不是在终端上写东西吗?我需要通过 USB 将它发送到电脑,所以我不能只打印一些东西。
    • @Bert printf() 和家庭通常可用于 PIC。有时可以合并的部分的范围及其大小取决于固定格式的参数字符串。整个包的代码空间有点贵。
    • 显然使用 sprintf() ,即使我包含 &lt;stdio.h&gt;,我的编译器/设备也不支持。
    【解决方案3】:

    这是一种将unsigned char 分解为十进制的方法,方法是除以 100、10,然后使用余数:

    #include <stdio.h>
    
    int main (void) {
       unsigned char val = 137;
       unsigned char res;
    
       printf("\n\nHundredths: %u\n", (int)((val / 100)));
       val = val % 100;
       printf("Tenths:     %u\n", (int)val / 10);
       printf("Ones:       %u\n", (int)val % 10);
    
       return 0;
    }
    

    程序输出:

    Hundredths: 1
    Tenths:     3
    Ones:       7
    

    要转换为 ASCII,您必须将 48 添加到每个整数值。每个数字的 ASCII 码是 49、51 和 55。

    【讨论】:

    • 很好奇,为什么 "%u" 带有 int 参数?看起来放弃所有 (int) 演员表会更好。
    【解决方案4】:

    下面提供了一个通用函数,用于将带符号的短二进制值转换为十进制数字形式的文本字符串,以及将无符号短二进制值转换为十六进制数字形式的文本字符串的配套函数。

    我认为如果您将 short 更改为 long 并将 unsigned short 更改为 unsigned long 相同的逻辑将分别将有符号长二进制值转换为十进制数字文本和将无符号长二进制值分别转换为十六进制数字文本.

    /*
     *   char *ShortToString (short sVal, char *pOutText, int iLen)
     *
     *   Input:    sVal      - binary value as a signed short to convert to text
     *             pOutText  - pointer to a character array to receive the text
     *             iLen      - length of the character array in characters
     *
     *   Returns:  char * - saved value of pOutText, pointer to beginning of output buffer
     *
     *   Description:  Converts the signed binary value of sVal into a text string of decimal digits.
     *                 If the value of sVal is negative, a minus sign is the first character.
     *                 If the output buffer length is too small, astericks are put into the buffer.
     *
     *                 WARNING: Buffer must be sized to include a terminating zero for the end
     *                          of string character.
    **/
    char *ShortToString (short sVal, char *pOutText, int iLen)
    {
        char *pOutTextSave = pOutText;
        char *pOutTextBegin = pOutText;
    
        if (sVal < 0) {
            sVal *= -1;
            *pOutText++ = '-';
        }
        pOutTextBegin = pOutText;    // remember where beginning of numeric string is
    
        // generate text digits in order from least significant to most significant
        do {
            *pOutText++ = (sVal % 10) + '0';  // convert least signicant decimal digit to text character
            sVal /= 10;                       // shift the binary value one decimal digit righ
        } while (sVal > 0 && pOutText + 1 < pOutTextSave + iLen);
    
        *pOutText = 0;   // end of string terminator
        pOutText--;      // back up one to point to last character.
    
        if (sVal) {
            // if there is insufficient room in the provided buffer for the string of digits
            // then indicate by filling the buffer with astericks.
            pOutTextBegin = pOutTextSave;
            while (pOutTextBegin + 1 < pOutTextSave + iLen) {*pOutTextBegin++ = '*'; }
            *pOutTextBegin = 0;   // end of string terminator
        } else {
            // reverse the string so that digits are in the right order,
            // most significant to least significant. we do this by swapping digits
            // until we come to the middle which means that everything is in order.
            while (pOutTextBegin < pOutText) {
                char k = *pOutTextBegin;
                *pOutTextBegin = *pOutText;
                *pOutText = k;
                pOutTextBegin++; pOutText--;
            }
        }
    
        return pOutTextSave;
    }
    
    /*
     *   char *HexShortToString (unsigned short usVal, char *pOutText, int iLen)
     *
     *   Input:    usVal     - binary value as an unsigned short to convert to text
     *             pOutText  - pointer to a character array to receive the text
     *             iLen      - length of the character array in characters
     *
     *   Returns:  char * - saved value of pOutText, pointer to beginning of output buffer
     *
     *   Description:  Converts the unsigned binary value of sVal into a text string of hex digits.
     *                 If the output buffer length is too small, astericks are put into the buffer.
     *
     *                 WARNING: Buffer must be sized to include a terminating zero for the end
     *                          of string character.
    **/
    char *HexShortToString (unsigned short usVal, char *pOutText, int iLen)
    {
        char *pOutTextSave = pOutText;
    
        // generate text digits in order from least significant to most significant
        do {
            unsigned char uChar = usVal & 0x000f;
    
            *pOutText++ = (uChar < 10) ? uChar + '0' : uChar - 10 + 'A';  // convert least signicant hex digit to text character
            usVal >>= 4;                       // shift the binary value one hex digit righ
        } while (usVal > 0 && pOutText + 1 < pOutTextSave + iLen);
    
        *pOutText = 0;   // end of string terminator
        pOutText--;      // back up one to point to last character.
    
        if (usVal) {
            // if there is insufficient room in the provided buffer for the string of digits
            // then indicate by filling the buffer with astericks.
            pOutText = pOutTextSave;
            while (pOutText + 1 < pOutTextSave + iLen) {*pOutText++ = '*'; }
            *pOutText = 0;   // end of string terminator
        } else {
            char *pOutTextBegin = pOutTextSave;
    
            // reverse the string so that digits are in the right order,
            // most significant to least significant. we do this by swapping digits
            // until we come to the middle which means that everything is in order.
            while (pOutTextBegin < pOutText) {
                char k = *pOutTextBegin;
                *pOutTextBegin = *pOutText;
                *pOutText = k;
                pOutTextBegin++; pOutText--;
            }
        }
    
        return pOutTextSave;
    }
    

    一个简单的测试工具如下。

    int main(int argc, char **argv)
    {
        char pOutBuff[16], pOutBuffHex[16];
        char *p, *pHex;
        short sVal, sLen;
    
        p = ShortToString((sVal = 0), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = 0), pOutBuff, (sLen = 2));
        printf (" sVal = %d  ShortToString() p = %s len = %d\n", sVal, p, sLen);
        p = ShortToString((sVal = 1), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = -1), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = 12), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = -12), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = 12), pOutBuff, (sLen = 2));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf ("     sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = -12), pOutBuff, (sLen = 2));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf ("     sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = 12), pOutBuff, (sLen = 3));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf ("     sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = -12), pOutBuff, (sLen = 3));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf ("     sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = 12), pOutBuff, (sLen = 4));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf ("     sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = -12), pOutBuff, (sLen = 4));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf ("     sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = -12), pOutBuff, (sLen = 5));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf ("     sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = 103), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = -103), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = 100), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = -100), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = 123), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = -123), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = 1234), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = -1234), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = 12345), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = -12345), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = 32767), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
        p = ShortToString((sVal = -32767), pOutBuff, (sLen = 15));
        pHex = HexShortToString(sVal, pOutBuffHex, sLen);
        printf (" sVal = %d  ShortToString() p = %s, 0x%x pHex=%s len = %d\n", sVal, p, sVal, pHex, sLen);
    
        return 0;
    }
    

    产生以下输出。

     sVal = 0  ShortToString() p = 0, 0x0 pHex=0 len = 15
     sVal = 0  ShortToString() p = 0 len = 2
     sVal = 1  ShortToString() p = 1, 0x1 pHex=1 len = 15
     sVal = -1  ShortToString() p = -1, 0xffffffff pHex=FFFF len = 15
     sVal = 12  ShortToString() p = 12, 0xc pHex=C len = 15
     sVal = -12  ShortToString() p = -12, 0xfffffff4 pHex=FFF4 len = 15
         sVal = 12  ShortToString() p = *, 0xc pHex=C len = 2
         sVal = -12  ShortToString() p = *, 0xfffffff4 pHex=* len = 2
         sVal = 12  ShortToString() p = 12, 0xc pHex=C len = 3
         sVal = -12  ShortToString() p = **, 0xfffffff4 pHex=** len = 3
         sVal = 12  ShortToString() p = 12, 0xc pHex=C len = 4
         sVal = -12  ShortToString() p = -12, 0xfffffff4 pHex=*** len = 4
         sVal = -12  ShortToString() p = -12, 0xfffffff4 pHex=FFF4 len = 5
     sVal = 103  ShortToString() p = 103, 0x67 pHex=67 len = 15
     sVal = -103  ShortToString() p = -103, 0xffffff99 pHex=FF99 len = 15
     sVal = 100  ShortToString() p = 100, 0x64 pHex=64 len = 15
     sVal = -100  ShortToString() p = -100, 0xffffff9c pHex=FF9C len = 15
     sVal = 123  ShortToString() p = 123, 0x7b pHex=7B len = 15
     sVal = -123  ShortToString() p = -123, 0xffffff85 pHex=FF85 len = 15
     sVal = 1234  ShortToString() p = 1234, 0x4d2 pHex=4D2 len = 15
     sVal = -1234  ShortToString() p = -1234, 0xfffffb2e pHex=FB2E len = 15
     sVal = 12345  ShortToString() p = 12345, 0x3039 pHex=3039 len = 15
     sVal = -12345  ShortToString() p = -12345, 0xffffcfc7 pHex=CFC7 len = 15
     sVal = 32767  ShortToString() p = 32767, 0x7fff pHex=7FFF len = 15
     sVal = -32767  ShortToString() p = -32767, 0xffff8001 pHex=8001 len = 15
    

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      相关资源
      最近更新 更多