`
ibadboy
  • 浏览: 84403 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

byte转String(转载)

    博客分类:
  • java
阅读更多
在剖析该问题前请看如下代码
public static String bytes2HexString(byte[] b) {
  String ret = "";
  for (int i = 0; i < b.length; i++) {
   String hex = Integer.toHexString(b[ i ] & 0xFF);
   if (hex.length() == 1) {
    hex = '0' + hex;
   }
   ret += hex.toUpperCase();
  }
  return ret;
}

引用

上面是将byte[]转化十六进制的字符串,注意这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b[ i ] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?答案是不行的.

其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式

在这里先温习下计算机基础理论

byte是一个字节保存的,有8个位,即8个0、1。
8位的第一个位是符号位,
也就是说0000 0001代表的是数字1
1000 0000代表的就是-1
所以正数最大位0111 1111,也就是数字127
负数最大为1111 1111,也就是数字-128

上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码

1、反码:
        一个数如果是正,则它的反码与原码相同;
        一个数如果是负,则符号位为1,其余各位是对原码取反;

2、补码:利用溢出,我们可以将减法变成加法
       对于十进制数,从9得到5可用减法:
       9-4=5    因为4+6=10,我们可以将6作为4的补数
       改写为加法:
       9+6=15(去掉高位1,也就是减10)得到5.

       对于十六进制数,从c到5可用减法:
       c-7=5    因为7+9=16 将9作为7的补数
       改写为加法:
       c+9=15(去掉高位1,也就是减16)得到5.

    在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(100000000),进位1被丢弃。

    ⑴一个数为正,则它的原码、反码、补码相同
    ⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1
   
- 1的原码为                10000001
- 1的反码为                11111110
                                                   + 1
- 1的补码为                11111111

0的原码为                 00000000
0的反码为                 11111111(正零和负零的反码相同)
                                          +1
0的补码为               100000000(舍掉打头的1,正零和负零的补码相同)

Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,
例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。
和0xff相与后,高24比特就会被清0了,结果就对了。

----
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。

而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。
分享到:
评论

相关推荐

    (转载网上)C# 语言编写的MD5 源代码 VS2010

    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(inputString); using (MD5 md5Hash = MD5.Create()) { byte[] hashBytes = md5Hash.ComputeHash(inputBytes); // 将字节转换为16进制字符串 ...

    jdk-8u241-windows-i586 (1).exe

    具体方法是:用HexBinaryAdapter类,他有一个marshal(byte[] bytes)方法,他可以将byte[]转换为String。 ———————————————— 版权声明:本文为CSDN博主「絕了千年良緣」的原创文章,遵循 CC 4.0 BY-...

    打败所有黑客的加密算法

    【欢迎转载或翻译该文】 现在上网,难免会涉及一些需要保密的内容,比如密码,账号,卡号,证件号等。但是黑客无处不在,他们常常窃听你的信息,给你放置陷阱,让你的防不胜防。 比如我现在要将信息“账号:123456...

    使用urlconnection下载文件或图片并保存到本地

    byte[] bs = new byte[1024]; // 读取到的数据长度 int len; // 输出的文件流 OutputStream os = new FileOutputStream(filename); // 开始读取 while ((len = is.read(bs)) != -1) { os.write(bs, 0...

    Unity 反序列化工具Protobuf

    using System; //需要用到MemoryStream using System.IO; using UnityEngine; //引入ProtoBuf命名空间 using ProtoBuf;...public class TestProtobuf : ...商业转载请联系作者获得授权,非商业转载请注明出处。

    Java程序员面试的试题集(1_122)帮助初学者的技术问题(转载)

    在Java中,基本数据类型包括 `byte`、`int`、`char`、`long`、`float`、`double`、`boolean` 和 `short`。对于这些基本数据类型,Java 提供了对应的封装类,如 `Integer` 封装 `int`、`Double` 封装 `double` 等。...

    (资料大全加程序)C++ 字符串之间的相互转化 宽字符与多字符集(LPTSTR、LPCSTR、LPCTSTR、LPSTR)

    - **多字符集(Multi-Byte Character Set,MBCS)**:又称多字节字符集,通常用于ASCII字符集的扩展,每个字符可能由1到多个字节组成,具体取决于特定的编码方式,如GBK。 2. **字符串类型指针**: - **LPCSTR**...

    网上转载JAVA面试基本大全

    - **基本数据类型**:如byte、int、char、long等,它们是Java语言内置的,由编译器直接支持,存储在栈中,效率高,但无法添加自定义方法。 - **封装类**:如Integer是int的封装类,提供了额外的功能,如比较、格式...

    CDMA 猫用AT命令发中文短信(C#)

    转载请注明来源 代码如下: void SendCHNSms(string content,string phone) { //中文CDMA发送,UNICODE编码字节 byte[] b = Encoding.BigEndianUnicode.GetBytes(content); //CDMA的AT命令手机号码前面不能加86,...

    Java实现文件下载

    public ResponseEntity&lt;StreamingResponseBody&gt; downloadFile(@RequestParam String fileName) throws IOException { File file = new File(fileName); HttpHeaders headers = new HttpHeaders(); headers....

    浅谈软件安全设计(一)

    --- 转载时请保留作者信息。 **************************************************************} 此CM的设计模式: 1、插入一些花指令 2、写了一些代码迷惑Cracker 3、有简单的Anti_DEDE 和检测调试...

    JNI完全技术手册 带完整书签

    Chap8:如何将java传递过来的jbyteArray转换成C/C++中的BYTE数组... 47 Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载)... 55 1、实例一:在jni中调用标准c中...

Global site tag (gtag.js) - Google Analytics