原来IntToHex是这么实现的。。。

看delphi自带的源码是如此:

function IntToHex(Value: Integer; Digits: Integer): string;
//  FmtStr(Result, '%.*x', [Digits, Value]);
asm
        CMP     EDX, 32        //为什么是edx呢?因为delphi函数的顺序是eax,edx,ecx,超过3个就push,所以  edx=digits.
        JBE     @A1              //digits小于等于32,跳到@A1
        XOR     EDX, EDX   //大于32就 digits := 0;
@A1:    PUSH    ESI       //保存esi
        MOV     ESI, ESP     //esp是栈顶指针。
        SUB     ESP, 32      //分配8个局部变量(32 div 4 = 8)
        PUSH    ECX            //返回值得指针
        MOV     ECX, 16        //   CvtInt的参数,0表示signed decimal, 10 or 16 表示unsigned      
        CALL    CvtInt          //delphi自己定义的一个函数,在SysUtils单元
        MOV     EDX, ESI   //esi是一个指向转换后文本的开始地址的指针
        POP     EAX            // result ptr
        CALL    System.@LStrFromPCharLen     pchar to Str的转换
        ADD     ESP, 32     //清除局部变量
        POP     ESI           
end;

而分析一个可执行程序却发现,原来可以这样:

c_HexStr='0123456789ABCDEF';

function TForm2.ByteToChr(b: byte): char;
begin
  result := c_hexstr[b+1];
end;

其实生成随机密码也可以用这个原理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答这个问题。以下是代码示例: public class HexConverter { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请选择转换类型:"); System.out.println("1. 十进制转十六进制"); System.out.println("2. 十六进制转十进制"); int choice = scanner.nextInt(); switch (choice) { case 1: System.out.println("请输入一个十进制数:"); int num = scanner.nextInt(); String hex = intToHex(num); System.out.println("转换结果为:" + hex); break; case 2: System.out.println("请输入一个十六进制数:"); String hstr = scanner.next(); int dec = hexToInt(hstr); System.out.println("转换结果为:" + dec); break; default: System.out.println("无效的选项!"); break; } } public static String intToHex(int num) { StringBuilder sb = new StringBuilder(); while (num > 0) { int remainder = num % 16; if (remainder < 10) { sb.append((char) ('0' + remainder)); } else { sb.append((char) ('A' + remainder - 10)); } num /= 16; } return sb.reverse().toString(); } public static int hexToInt(String hstr) { int num = 0; for (int i = 0; i < hstr.length(); i++) { char c = hstr.charAt(i); int digit = 0; if (c >= '0' && c <= '9') { digit = c - '0'; } else if (c >= 'A' && c <= 'F') { digit = c - 'A' + 10; } else if (c >= 'a' && c <= 'f') { digit = c - 'a' + 10; } else { throw new IllegalArgumentException("无效的十六进制数:" + hstr); } num = num * 16 + digit; } return num; } } 希望这个程序能够满足您的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值