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/