java byte[] 数组 ASCII码的十进制、十六进制和字符串的转换

import java.util.Arrays;

/**
 * Created by XiChuan on 2018-11-07.
 */
public class TestMain {
    private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5',
            '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};


    public static void main(String[] args){
        byte[] b = new byte[]{'d',(byte)0xff,-1,(byte)255,(byte)0x80,(byte) 128,-128};
        byte[] ba = new byte[]{'a','A',(byte)0x41,(byte)0x61};

        //将byte[]数组用字符串表示
        // [100, -1, -1, -1, -128, -128, -128]
        System.out.println( Arrays.toString(b));
        // [97, 65, 65, 97]
        System.out.println( Arrays.toString(ba));//这个是byte[]中实际存的值

        //打印出byte[]的十六进制字符串
        System.out.println(bytesToHexString(b));
        System.out.println(bytesToHexString(ba));///这个存的是实际的每个字节的二级制表现形式

        //打印出byte[]的ascii的字符串
        // d������
        System.out.println(new String(b));
        // aAAa
        System.out.println(new String(ba)); //ascii范围是如果不是0-127的字段,会转为乱码



    }}

参考:https://blog.csdn.net/zc_ad/article/details/83825688

实现方式很多,下面提供一种基于x86架构的汇编实现方式。 假设我们要将以下ASCII码数字串转换十六进制字符串: ``` input db '12345678' ``` 首先需要准备一个输出缓存区,用于存储转换后的十六进制字符串。可以定义如下变量: ``` output db 8 dup (?) ; 存储转换后的结果 ``` 接下来就是核心的转换代码。下面是一个实现思路: 1. 用 xlat 指令读取 input 中的一个字节。 2. 将读取的字节的高四位右移 4 位,得到对应的十六进制字符。 3. 将读取的字节的低四位与 0x0F 取与运算,得到对应的十六进制字符。 4. 把上述两个十六进制字符分别存储到 output 中。 5. 重复上述过程,直到 input 的末尾。 具体的汇编代码如下: ``` mov si, offset input ; 指向input mov di, offset output ; 指向output mov cx, 8 ;共8个字节 L1: mov al, [si] ; AL = input[i] mov bh, al ; bh暂存高四位 shr al, 4 ; al = input[i] >> 4 call byte [hex_char] ; 转换十六进制字符 mov [di], al ; 存储到output inc di ; output++ mov al, bh ; al恢复原始值 and al, 0x0F ; al = input[i] & 0x0F call byte [hex_char] ; 转换十六进制字符 mov [di], al ; 存储到output inc di ; output++ inc si ; input++ loop L1 ; 循环8次 hexit: ; 将十进制数 0-15 转换十六进制字符 '0'-'F' push ax ; 保存参数 cmp al, 10 jl .less_than_10 ; ax < 10 add al, 'A' - 10 ; ax >= 10, 转换成 'A'-'F' jmp .store_char .less_than_10: add al, '0' ; 转换成 '0'-'9' .store_char: mov ah, 0 ; 存储到 al 指向的地址 stosb pop ax ; 恢复参数 ret hex_char db 0 ; 为了让 call 指令能够正确调用 hexit ``` 最后,就可以查看存储在 output 中的十六进制字符串了: ``` mov dx, offset output mov ah, 9 int 21h ``` 以上代码中使用了 `call byte [hex_char]` 调用了一个子函数 hexit,用于将十进制转换十六进制字符。为了让 call 指令能够正确调用 hexit 子函数,需要定义一个跳转表 hex_char,并在程序开始处设置正确的跳转目标。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值