`
talentluke
  • 浏览: 604703 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

byte转换成16字节字符串

 
阅读更多

在剖析该问题前请看如下代码
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,于是结果总是我 们想要的。

分享到:
评论

相关推荐

    android byte字节数组转换十六进制字符串

    在Android开发中,有时我们需要将字节数组(byte array)转换为十六进制字符串,以便于数据存储、传输或调试。这是因为字节数组是二进制数据,而十六进制字符串则是一种人类可读的表示方式。下面我们将详细讨论如何...

    vb6.0 字节数组和字符串的相互转换.rar

    或者将字符串转换成字节数组,写入二进制文件。 示例: ```vb ' 读取二进制文件到字节数组 Open "binaryfile.bin" For Binary As #1 Dim fileByteArray() As Byte ReDim fileByteArray(LOF(1) - 1) Get #1, , ...

    Go-此工具用于将16进制字符串转换成10进制byte数组

    本工具专注于将16进制字符串转换为10进制的byte数组,这在处理如数据库存储、加密解密、网络通信等场景中非常常见。 1. **16进制字符串与10进制byte数组的概念** - **16进制字符串**:由0-9和A-F(或a-f)字符组成...

    16进制与字符串、字节数组之间的转换

    根据给定的信息,本文将详细解释16进制与字符串、字节数组之间的转换方法,并结合提供的C#代码示例进行深入分析。 ### 一、16进制与整数之间的转换 #### 1.1 二进制转十六进制 在计算机科学中,经常需要将不同进制...

    字符串与字节数组之间的转换

    本文将详细介绍如何在.NET框架下实现字符串与字节数组之间的转换,特别是字符串到16进制数组的转换以及反过来的转换方法。 #### 一、字符串转化为16进制的数组 在某些情况下,我们需要将字符串转换为16进制的字节...

    Delphi字符串16进制互相转换

    在Delphi中,16进制字符串转换为整数或字节数组,以及将整数或字节数组转换为16进制字符串,有多种方法。我们可以使用系统提供的函数,如`Hex`和`IntToHex`来进行转换。 1. **16进制字符串转整数**: - 使用`...

    java16进制与字符串的转换.pdf

    在 Java 中,我们可以使用 `Bytes2HexString` 函数将 byte 数组转换为 16 进制字符串。该函数接受一个参数 b,即 byte 数组,然后将其转换为 16 进制字符串。 ```java public static String Bytes2HexString(byte[]...

    单字节 多字节 双字节 相互转换

    * `mbstowcs()`:将多字节字符串转换为双字节字符串数组 * `wcstombs()`:将双字节字符串数组转换为多字节字符串 在实际应用中,需要根据实际情况选择合适的转换函数,以确保字符串的正确转换。 Unicode 和宽字符...

    字符串转16进制字节

    反之,如果我们有一个16进制字节序列,想要将其还原为字符串,我们需要先将16进制字符串解析为字节,然后再解码成字符串。在Python中,这可以通过`unhexlify`和`decode`函数完成: ```python hex_str = "48656c6c6...

    C# 按照字节长度截取字符串

    // 将字符串转换为字节数组 byte[] inputBytes = encoding.GetBytes(input); // 检查输入字节数是否超过字符串实际长度 if (byteLength &gt; inputBytes.Length) return input; // 使用正则表达式匹配前n个字节...

    TIA博途-字符转换为字符串以及截取字符串有效字符的具体方法示例.docx

    在TIA博途中,如果接收到的是以字节形式传输的ASCII码值,我们需要将其转换为对应的字符,进而组成字符串。例如,'A'的ASCII码值是65,'B'是66,以此类推。通过SCL(Structured Control Language,结构化控制语言)...

    C# 字符串转十六进制串,16进制反向转回原字符串

    在这里,我们使用`Substring`方法提取每两个字符形成一个字节的十六进制值,然后用`Convert.ToByte`将其转换为字节,最后通过`Encoding.Unicode.GetString`将字节数组解码为字符串。 注意,由于Unicode编码中每个...

    C#16进制与字符串字节数组之间的转换代码

    它遍历每个字节,将其转换为十六进制表示形式,并拼接成一个新的字符串返回。 ```csharp public static string byteToHexStr(byte[] bytes) { string returnStr = ""; if (bytes != null) { for (int i = 0; i ...

    二维码图片转换成BASE64字符串

    二维码图片转换成BASE64字符串是一项常见的数据处理任务,在IT领域中有着广泛的应用。二维码(Quick Response Code)是一种二维条形码,可以存储大量的文本、网址、名片等信息,而BASE64则是一种用于将二进制数据...

    二进制字节与字符串之间的转换

    在IT领域,数据的处理和传输常常涉及到二进制字节和字符串之间的转换。这是因为不同的系统和编程语言可能以不同的方式处理数据,有时需要将原始的二进制数据转化为易于处理和显示的字符串形式,反之亦然。在这个过程...

    String(含Hex)与Byte数组互相转换[代码]

    遍历字节数组,将每个字节转换为其对应的十六进制字符,并拼接成字符串。例如: ```java public static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { ...

    php字符串与byte字节数组转化类.zip

    介绍php字符串与byte字节数组转化类,转换一个String字符串为byte数组,将字节数组转化为String类型的数据,转换一个int为byte数组,从字节数组中指定的位置读取一个Integer类型的数据,转换一个shor字符串为byte...

    android字符串和16进制转换

    这个函数会将16进制字符串拆分成两字符一组,解析每组为16进制的整数,然后将这些整数转换为字节,最终组合成一个字符串。 **使用Java提供的工具类** 除了自定义方法外,Android也提供了`java.util.Formatter`和`...

    delphi-string互相转化为byte数组

    在Delphi编程环境中,字符串(String)与字节数组(Byte Array)之间的转换是常见的操作,尤其是在处理二进制数据、网络通信或者文件读写时。本文将深入探讨如何在Delphi中实现这两种类型的数据互换。 1. **字符串...

    c#与编码无关的字符串与字节数组相互转换

    web应用中,客户端和服务器端需要交换信息,字符串形式的信息交互是...如果字符串中有中文,客户端在信息发送前需要把它转换为字节数组,转换的时候需要采用指定的编码。 本文提供的方法不需要指定编码,是通用的方法。

Global site tag (gtag.js) - Google Analytics