Let's Go!

LoadRunner/C/java 二进制转换

上一篇 / 下一篇  2011-10-28 10:46:11 / 个人分类:LoadRunner

LoadRunner/C 二进制转换

LoadRunner输出二进制流,同理处理8进制、16进制:

void Main()
{
char   buff[20];  

change(100,2,buff);  
lr_output_message("%s\n",buff);  
change(100,8,buff);  
lr_output_message("%s\n",buff);  
change(100,10,buff);  
lr_output_message("%s\n",buff);  
change(100,16,buff);  
lr_output_message("%s\n",buff);  
}



char   *change(int   val,   int   base,   char   *retbuf   )  
{  
static   char         *str   =   "0123456789ABCDEF";  
char   *p;  
char   buf[15];  

p   =   buf+14;  
*p   =   0;  

do   {   *--p   =   str[val   %   base];   }   while(   val   /=   base   );  
strcpy(retbuf,p);  
return   retbuf;  
}


输出就不打印了,运行一下就知了。

另外还有一种简单的方法,直接用itoa或strtol转换:

void Main()
{


    char dnum[40]="测试";
    char cnum[32];


    itoa(dnum,cnum,2);
    lr_output_message("the binary number is:%s",cnum);     
return 0; 
}

   

 

http://blog.csdn.net/gzh0222/article/details/6644371

 

JAVA中实现十进制与其它自定义进制进行相互转换。  

 

 

我们通常用到的数字都是十进制的,日常使用的也是这样,但是在程序中,我们可能还会经常用到二进制、八进制、十六进制的数字。既然程序中会使用到,那么就会有它存在的道理。有些时候,将数字用字符串保存到文件或者数据库中,你会发现,十进制的64在二进制中表示为1000000,在八进制中表示为100,在十六进制中表示为40。于是,需要将64存储到文件或者数据库中,用二进制表示的话占用了7个字符长度,八进制占了3个字符长度,而十进制、十六进制都只用了2个字符长度,可以看出,如果要使用最想的空间来存储一个普通的十进制数字,只要使用更高的进制表示就可以节省更多的空间。现在,我们完全可以自定义属于自己的进制表示,可以是N进制,当然N会有一定的限制。

  下面的源代码给出了自定义进制转换的方法:
 /**
  * 在进制表示中的字符集合。
  */
 final static char[] digits = {
  '0' , '1' , '2' , '3' , '4' ,'5' ,
  '6' , '7' , '8' , '9' , 'a' ,'b' ,
  'c' , 'd' , 'e' , 'f' , 'g' ,'h' ,
  'i' , 'j' , 'k' , 'l' , 'm' ,'n' ,
  'o' , 'p' , 'q' , 'r' , 's' ,'t' ,
  'u' , 'v' , 'w' , 'x' , 'y' ,'z'
 };
 /**
  * 将十进制的数字转换为指定进制的字符串。
  * @param i 十进制的数字。
  * @param system 指定的进制,常见的2/8/16。
  * @return 转换后的字符串。
  */
 public String toCustomNumericString(int i, intsystem) {
  long num = 0;
  if (i < 0) {
   num =((long)2 * 0x7fffffff) + i + 2;
  } else {
   num =i;
  }
  char[] buf = newchar[32];
  int charPos = 32;
  while ((num / system) > 0){
   buf[--charPos]= digits[(int)(num % system)];
   num /=system;
  }
  buf[--charPos] =digits[(int)(num % system)];
  return new String(buf, charPos,(32 - charPos));
 }
 
 /**
  *将其它进制的数字(字符串形式)转换为十进制的数字。
  * @param s 其它进制的数字(字符串形式)
  * @param system 指定的进制,常见的2/8/16。
  * @return 转换后的数字。
  */
 public int toCustomNumeric(String s, int system){
  char[] buf = newchar[s.length()];
  s.getChars(0, s.length(), buf,0);
  long num = 0;
  for (inti=0;i<buf.length;i++) {
   for (intj=0;j<digits.length;j++) {
    if(digits[j] == buf[i]) {
     num+= j * Math.pow(system, buf.length - i -1);
     break;
    }
   }
  }
  return (int)num;
 }
 
  从上面的代码中可以看出,由于受到digits字符数量的限制,现在能够实现的最大自定义进制只有36进制,如果想要构造更大的进制表示,我们可以扩充digits中的字符。当然不能自己构造一个一进制、零进制的数字。
  下面的一个方法是JDK中的标准类库提供的方法,它在性能上有很大的提高,毕竟用到了位运算,而不是简单的比较。
private static String toUnsignedString(int i, int shift){
  char[] buf = newchar[32];
  int charPos = 32;
  int radix = 1 <<shift;
  int mask = radix - 1;
  do {
     buf[--charPos] = digits[i & mask];
     i >>>= shift;
  } while (i != 0);
  return new String(buf,charPos, (32 - charPos));
 }
  由于用到了位移操作,所以它的进制表示只是局限于2/4/8/16/32,其它的就不能实现了。当shift为1时,表示二进制;当shift为2时,表示四进制;依次类推。
 
http://yz124.blog.163.com/blog/static/36663682006112102813233/

TAG:

 

评分:0

我来说两句

Open Toolbar