【问题标题】:C: Splitting integer and converting it to ASCIIC:拆分整数并将其转换为 ASCII
【发布时间】:2012-07-31 17:31:06
【问题描述】:

我想将整数拆分为数字,然后将每个数字转换为 ASCII(在 C 编程语言中)。

例子:

int x = 0xABC
/* split integers */
int x1 = 0xA
int x2 = 0xB
int x3 = 0xC
/* convert integers to ASCII */
int x1 = 0x41
int x2 = 0x42
int x3 = 0x43

另外,如果整数只有 2 位长(十六进制),我仍然需要 3 次拆分:

int y = 0xBC
/* split integers */
int y1 = 0x0
int y2 = 0xB
int y3 = 0xC 
.
.
.

非常感谢!

【问题讨论】:

标签: c integer ascii uart


【解决方案1】:

使用数学:x = x₁ · 16² + x₂ · 16 + x₃

使用查找表查看数字是什么:

static const char hex[16] = "0123456789ABCDEF";

y1 = hex[x1];
...

我不会给你一个完整的解决方案,因为这是一个与作业相关的问题。


完整的解决方案(不太容易理解):

// Divide by 16^n and take the modulo 16:
int x1 = (x >> 8) & 0xF; // == (x/256) % 16
int x2 = (x >> 4) & 0xF; // == (x/16) % 16
int x3 = (x >> 0) & 0xF; // == x % 16

int y1 = x1 < 10 ? x1+'0' : x1+'A'-10;
int y2 = x2 < 10 ? x2+'0' : x2+'A'-10;
int y3 = x3 < 10 ? x3+'0' : x3+'A'-10;

【讨论】:

  • 我以为十六进制的底数是 16...?
  • @Kay:这不是与家庭作业相关的问题,实际上我正在尝试找到通过 UART 发送整数的最佳方法......唯一的方法是将它们转换为 ASCII 值,以其他方式我无法区分它们。还是谢谢!
  • @InternetSeriousBusiness 那么您将不得不使用 if 表达式或条件。我想查找表更容易理解,不是吗?
  • 是否可以这样做:int x3 = (x >> 0) & 0xF; // == x % 16 int y1 = x3
  • @jurij 是可能的,你可以插入中间值:((x &gt;&gt; 8) &amp; 0xF) + (((x &gt;&gt; 8) &amp; 0xF) &lt; 10 ? '0' : 'A'-10)。不过,这对眼睛来说很可怕。查找表方法可能更容易阅读:hex[(x &gt;&gt; 8) &amp; 0xF]
【解决方案2】:

好的,你的问题没有给我足够的信息来回答驱魔的“精神”......但是你去:

int x = 0xABC;
printf("%03X",x); // Result = "ABC"
x = 0xAB;
printf("%03X",x); // Result = "0AB"

如果您想存储结果,可以轻松地将其修改为sprintf

【讨论】:

    【解决方案3】:
                 A PROGRAM TO CONVERT INT INTO ASCII.
    
    
    
    
                  #include<stdio.h>
                  #include<string.h>
                  #include<conio.h>
    
                   char data[1000]= {' '};           /*thing in the bracket is optional*/
                   char data1[1000]={' '};
                   int val, a;
                   char varray [9];
    
                   void binary (int digit)
                  {
                      if(digit==0)
                       val=48;
                      if(digit==1)
                       val=49;
                      if(digit==2)
                       val=50;
                      if(digit==3)
                       val=51;
                      if(digit==4)
                       val=52;
                      if(digit==5)
                       val=53;
                      if(digit==6)
                       val=54;
                      if(digit==7)
                       val=55;
                      if(digit==8)
                       val=56;
                      if(digit==9)
                        val=57;
                        a=0;
    
                   while(val!=0)
                   {
                      if(val%2==0)
                       {
                        varray[a]= '0';
                       }
    
                       else
                       varray[a]='1';
                       val=val/2;
                       a++;
                   }
    
    
                   while(a!=7)
                  {
                    varray[a]='0';
                    a++;
                   }
    
    
                  varray [8] = NULL;
                  strrev (varray);
                  strcpy (data1,varray);
                  strcat (data1,data);
                  strcpy (data,data1);
    
                 }
    
    
                  void main()
                 {
                   int num;
                   clrscr();
                   printf("enter number\n");
                   scanf("%d",&num);
                   if(num==0)
                   binary(0);
                   else
                   while(num>0)
                   {
                   binary(num%10);
                   num=num/10;
                   }
                   puts(data);
                   getch();
    
                   }
    

    我检查了我的编码,它工作正常。它将任何给定的整数转换为ASCII码。必须尝试让我知道这是否是您想要的,谢谢。

    【讨论】:

      【解决方案4】:

      由于这是家庭作业,我不会直接解决问题。

      首先,我对拆分“整数”的意思感到困惑。看起来(从示例中)您希望拆分十六进制数,而不是十进制数。无论哪种方式,想想如何构建一个数字:123 = 1*100 + 2*10 + 3*1 = 1*10^2 + 2*10^1 + 3*10^0。您如何区分 1 与 2 和 3? (提示,使用乘法的相反数。)(另一个提示,如果它是十六进制,请记住将基数从 10 更改为 16)

      现在假设您已将数字拆分为单独的变量。好吧,ascii 表以非常“方便”的方式构建。查找表格,找到所需数字的 ascii 值。从那里,将是一个简单的常量加法/减法来获得数字的 ascii 表示。

      (另一个提示)我假设您的意思是将int 转换为char。请记住,这些位只是数据。您可以更改数据的表示。搜索“将 int 转换为 char”。

      【讨论】:

      • 不,我不想要字符。我想要十六进制数字,存储在一个整数 (0...A) 中,转换成它的 ascii 值,而不是转换成 ascii char!
      • 套用我当时说的大部分内容:使用上面的方法一次一个地划分数字(除了使用基数 16 而不是 10),然后添加数字和 ascii 之间的常数差值(加 48 转换 0 和 9 之间的数字,加 55 转换 A 和 F 之间的数字)
      猜你喜欢
      • 1970-01-01
      • 2014-03-31
      • 2014-09-03
      • 2012-07-04
      • 2011-05-11
      • 2013-01-13
      • 2016-08-01
      • 2016-04-29
      • 1970-01-01
      相关资源
      最近更新 更多