账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Java byte[]数组转换成16进制字符,为什么要加0x100
    67
    0
    byte数组转为字符串,Integer.toString((bytes[i] & 0xff) + 0x100, 16)中,为什么要加0x100,看不懂注释,求大佬解释 看懂了 0到f只输出了一位public static String byte2Hex(byte[] bytes) { if (bytes == null) { return null; } StringBuilder builder = new StringBuilder(); // 遍历byte[]数组,将每个byte数字转换成16进制字符,再拼接起来成字符串 for (int i = 0; i < bytes.length; i++) { // 每个byte转换成16进制字符时,bytes[i] & 0xff如果高位是0,输出将会去掉,所以+0x100(在更高位加1),再截取后两位字符 builder.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1)); } return builder.toString(); }public class MyClass { public static void main(String[] args) { byte[] ba=new byte[256]; for (int i = -128; i <= 127; i++) { ba[i+128]=(byte)i; System.out.println(ba[i+128]); } for (int i = 0; i <=255; i++) { System.out.print(Integer.toString(ba[i]&0xff,16)+" "); System.out.println(Integer.toString((ba[i]&0xff)+0x100,16)); } }}0到f只输出了一位80 18081 18182 18283 18384 18485 18586 18687 18788 18889 1898a 18a8b 18b8c 18c8d 18d8e 18e8f 18f90 19091 19192 19293 19394 19495 19596 19697 19798 19899 1999a 19a9b 19b9c 19c9d 19d9e 19e9f 19fa0 1a0a1 1a1a2 1a2a3 1a3a4 1a4a5 1a5a6 1a6a7 1a7a8 1a8a9 1a9aa 1aaab 1abac 1acad 1adae 1aeaf 1afb0 1b0b1 1b1b2 1b2b3 1b3b4 1b4b5 1b5b6 1b6b7 1b7b8 1b8b9 1b9ba 1babb 1bbbc 1bcbd 1bdbe 1bebf 1bfc0 1c0c1 1c1c2 1c2c3 1c3c4 1c4c5 1c5c6 1c6c7 1c7c8 1c8c9 1c9ca 1cacb 1cbcc 1cccd 1cdce 1cecf 1cfd0 1d0d1 1d1d2 1d2d3 1d3d4 1d4d5 1d5d6 1d6d7 1d7d8 1d8d9 1d9da 1dadb 1dbdc 1dcdd 1ddde 1dedf 1dfe0 1e0e1 1e1e2 1e2e3 1e3e4 1e4e5 1e5e6 1e6e7 1e7e8 1e8e9 1e9ea 1eaeb 1ebec 1eced 1edee 1eeef 1eff0 1f0f1 1f1f2 1f2f3 1f3f4 1f4f5 1f5f6 1f6f7 1f7f8 1f8f9 1f9fa 1fafb 1fbfc 1fcfd 1fdfe 1feff 1ff0 1001 1012 1023 1034 1045 1056 1067 1078 1089 109a 10ab 10bc 10cd 10de 10ef 10f10 11011 11112 11213 11314 11415 11516 11617 11718 11819 1191a 11a1b 11b1c 11c1d 11d1e 11e1f 11f20 12021 12122 12223 12324 12425 12526 12627 12728 12829 1292a 12a2b 12b2c 12c2d 12d2e 12e2f 12f30 13031 13132 13233 13334 13435 13536 13637 13738 13839 1393a 13a3b 13b3c 13c3d 13d3e 13e3f 13f40 14041 14142 14243 14344 14445 14546 14647 14748 14849 1494a 14a4b 14b4c 14c4d 14d4e 14e4f 14f50 15051 15152 15253 15354 15455 15556 15657 15758 15859 1595a 15a5b 15b5c 15c5d 15d5e 15e5f 15f60 16061 16162 16263 16364 16465 16566 16667 16768 16869 1696a 16a6b 16b6c 16c6d 16d6e 16e6f 16f70 17071 17172 17273 17374 17475 17576 17677 17778 17879 1797a 17a7b 17b7c 17c7d 17d7e 17e7f 17f
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 暮雨声寒 普通会员 1楼
      在Java中,将`byte[]`数组转换为16进制字符串时,并不需要直接加上0x100。这个操作可能是某些特定场景下为了进行正确转换而做的一个数据处理。 `byte`在Java中是带符号的8位整数,其取值范围是-128到127。当我们将其转换为16进制表示时,可能需要将其转换为无符号的数值,这时可能会用到0x100。 例如,当某个byte的值为负数时,直接转换为16进制可能会得到一个非预期的结果(因为负数的二进制补码形式会以1开头)。为了得到正确的无符号16进制表示,一种方法是先将每个字节与0x100进行按位或运算(`|`),这样可以确保得到一个正数,然后再转换为16进制。 但这并不是标准的或常见的做法,更常见的方式是通过一些库函数或者手动进行移位和与运算来实现无符号转换,如下所示: ```java public static String bytesToHex(byte[] bytes) { StringBuilder result = new StringBuilder(); for (byte b : bytes) { result.append(String.format("%02x", b & 0xFF)); } return result.toString(); } ``` 在这个示例中,`b & 0xFF`就是用来获取无符号的8位整数值,然后使用`String.format`将其转换为16进制字符串。
    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部