侠盗猎车手5秘籍大全在手机上怎么打密籍

Java中byte与16进制字符串的互相转换
我的图书馆
Java中byte与16进制字符串的互相转换
Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果new String(H) + new String(L)。即byte用十六进制表示只占2位。
同理,相反的转换也是将两个16进制字符转换成一个byte,原理同上。
根据以上原理,我们就可以将byte[] 数组转换为16进制字符串了,当然也可以将16进制字符串转换为byte[]数组了。
Java代码 &&*&Convert&byte[]&to&hex&string.这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。&&&*&@param&src&byte[]&data&&&*&@return&hex&string&&&*/&&&&&public&static&String&bytesToHexString(byte[]&src){&&&&&&StringBuilder&stringBuilder&=&new&StringBuilder("");&&&&&&if&(src&==&null&||&src.length&&=&0)&{&&&&&&&&&&return&null;&&&&&&}&&&&&&for&(int&i&=&0;&i&&&src.&i++)&{&&&&&&&&&&int&v&=&src[i]&&&0xFF;&&&&&&&&&&String&hv&=&Integer.toHexString(v);&&&&&&&&&&if&(hv.length()&&&2)&{&&&&&&&&&&&&&&stringBuilder.append(0);&&&&&&&&&&}&&&&&&&&&&stringBuilder.append(hv);&&&&&&}&&&&&&return&stringBuilder.toString();&&}&&&&&&&&public&static&byte[]&hexStringToBytes(String&hexString)&{&&&&&&if&(hexString&==&null&||&hexString.equals(""))&{&&&&&&&&&&return&null;&&&&&&}&&&&&&hexString&=&hexString.toUpperCase();&&&&&&int&length&=&hexString.length()&/&2;&&&&&&char[]&hexChars&=&hexString.toCharArray();&&&&&&byte[]&d&=&new&byte[length];&&&&&&for&(int&i&=&0;&i&&&&i++)&{&&&&&&&&&&int&pos&=&i&*&2;&&&&&&&&&&d[i]&=&(byte)&(charToByte(hexChars[pos])&&&&4&|&charToByte(hexChars[pos&+&1]));&&&&&&}&&&&&&return&d;&&}&&&&&&&&&private&byte&charToByte(char&c)&{&&&&&&return&(byte)&"ABCDEF".indexOf(c);&&}&&
Java代码 &&&public&static&void&printHexString(&byte[]&b)&{&&&&&&&for&(int&i&=&0;&i&&&b.&i++)&{&&&&&&&&String&hex&=&Integer.toHexString(b[i]&&&0xFF);&&&&&&&&if&(hex.length()&==&1)&{&&&&&&&&&&hex&=&'0'&+&&&&&&&&&}&&&&&&&&System.out.print(hex.toUpperCase()&);&&&&&&}&&&&&}&&
java中byte转换int时为何与0xff进行与运算
在剖析该问题前请看如下代码
Java代码 &public&static&String&bytes2HexString(byte[]&b)&{&&&&String&ret&=&"";&&&&for&(int&i&=&0;&i&&&b.&i++)&{&&&&&String&hex&=&Integer.toHexString(b[&i&]&&&0xFF);&&&&&if&(hex.length()&==&1)&{&&&&&&hex&=&'0'&+&&&&&&}&&&&&ret&+=&hex.toUpperCase();&&&&}&&&&return&&&}&&
&上面是将byte[]转化十六进制的字符串,注意这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出b[ i ] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?答案是不行的.其原因在于:1.byte的大小为8bits而int的大小为32bits2.java的二进制采用的是补码形式在这里先温习下计算机基础理论byte是一个字节保存的,有8个位,即8个0、1。8位的第一个位是符号位, 也就是说代表的是数字1 代表的就是-1 所以正数最大位,也就是数字127 负数最大为,也就是数字-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,在内存中情况为(),进位1被丢弃。& & ⑴一个数为正,则它的原码、反码、补码相同& & ⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1& & - 1的原码为& && && && && & - 1的反码为& && && && && & & && && && && && && && && && && && && && && && && &+ 1- 1的补码为& && && && && & 0的原码为& && && && && &&&0的反码为& && && && && &&&(正零和负零的反码相同)& && && && && && && && && && && && && && &+10的补码为& && && && && &(舍掉打头的1,正零和负零的补码相同)Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位,例如补码的十进制数为-1转换为int时变为好多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,于是结果总是我们想要的。
发表评论:
TA的最新馆藏2005年1月 VB大版内专家分月排行榜第二
2005年3月 VB大版内专家分月排行榜第三
2005年1月 VB大版内专家分月排行榜第二
2005年3月 VB大版内专家分月排行榜第三
2005年1月 VB大版内专家分月排行榜第二
2005年3月 VB大版内专家分月排行榜第三
2005年1月 VB大版内专家分月排行榜第二
2005年3月 VB大版内专家分月排行榜第三
2005年1月 VB大版内专家分月排行榜第二
2005年3月 VB大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。字节数组和十六进制字符串的转换 | 爱酷学习网博客
当前位置: &
1,570 阅读此文人 -
在实际中会遇到这样的需求,即将一个字符串转换成二进制数组,但二进制数组的传输却并不方便,例如通过HTTP协议传输,因此需要把二进制字节数组 转换成十六进制字符串,接收方接收该字符串以后,再把它转换成二进制字节数组。这有一个好处,就是可以避免乱码,从来适用于各种场合,有很好的适应性。
我所遇到的情况是,出于安全的考虑,需要对信息进行加密,但加密后返回的是字节数组,无法将加密后的数据直接放在文本中使用,而实际又有这样的需求,因此也需要这样的转换。以下就是实现,希望能对有需要的朋友有些帮助。
* ByteHEXUtils.java created by Dirac on
package com.into4g.service.
* @author Dirac
public class ByteHEXUtils {
static final byte[] HEX_TABLE = {0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF};
static final char[] HEX_CHAR_TABLE = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
public String toHexString(byte[] data) throws Exception{
if(data==null || data.length==0)
byte[] hex = new byte[data.length*2];
int index = 0;
for(byte b: data){
int v = b & 0xFF;
hex[index++] = (byte)HEX_CHAR_TABLE[v&&&4];
hex[index++] = (byte)HEX_CHAR_TABLE[v&0xF];
return new String(hex);
public byte[] hexToByte(String hexString){
if(hexString==null || hexString.length()==0)
if(hexString.length()%2!=0)throw new RuntimeException();
byte[] data = new byte[hexString.length()/2];
char[] chars = hexString.toCharArray();
for(int i=0;i&hexString.length();i=i+2){
data[i/2] = (byte)(HEX_TABLE[getHexCharValue(chars[i])]&&4 | HEX_TABLE[getHexCharValue(chars[i+1])]);
private int getHexCharValue(char c){
int index = 0;
for(char c1: HEX_CHAR_TABLE){
if(c==c1){
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
/** * ByteHEXUtils.java created by Dirac on
*/package com.into4g.service.util;&/** * @author Dirac * @since
*/public class ByteHEXUtils { static final byte[] HEX_TABLE = {0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF}; static final char[] HEX_CHAR_TABLE = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
public String toHexString(byte[] data) throws Exception{ if(data==null || data.length==0)return null; byte[] hex = new byte[data.length*2]; int index = 0; for(byte b: data){ int v = b & 0xFF; hex[index++] = (byte)HEX_CHAR_TABLE[v&&&4]; hex[index++] = (byte)HEX_CHAR_TABLE[v&0xF]; } return new String(hex); }
public byte[] hexToByte(String hexString){ if(hexString==null || hexString.length()==0)return null; if(hexString.length()%2!=0)throw new RuntimeException(); byte[] data = new byte[hexString.length()/2]; char[] chars = hexString.toCharArray(); for(int i=0;i&hexString.length();i=i+2){ data[i/2] = (byte)(HEX_TABLE[getHexCharValue(chars[i])]&&4 | HEX_TABLE[getHexCharValue(chars[i+1])]); } return data; }
private int getHexCharValue(char c){ int index = 0; for(char c1: HEX_CHAR_TABLE){ if(c==c1){ return index; } index++; } return 0; }}
* ByteHEXUtilsTest.java created by Dirac on
package com.into4g.service.
import static org.junit.Assert.*;
import org.junit.B
import org.junit.T
* @author Dirac
public class ByteHEXUtilsTest {
private ByteHEXU
* @throws java.lang.Exception
public void setUp() throws Exception {
utils = new ByteHEXUtils();
* Test method for {@link com.into4g.service.util.ByteHEXUtils#toHexString(byte[])}.
* @throws Exception
public final void testToHexString() throws Exception {
byte[] bytes = "岁月是把杀猪刀,人生任由他宰割。".getBytes("utf-8");
String data = utils.toHexString(bytes);
System.out.println(data);
assertTrue(true);
//fail("Not yet implemented"); // TODO
* Test method for {@link com.into4g.service.util.ByteHEXUtils#hexToByte(java.lang.String)}.
public final void testHexToByte() throws Exception{
byte[] data = utils.hexToByte("E5B281E69C88E698AFE68A8AE69D80E78CAAE58880EFBC8CE4BABAE7949FE4BBBBE794B1E4BB96E5AEB0E589B2E38082");
String str = new String(data, "utf-8");
System.out.println("str======="+str);
//fail("Not yet implemented"); // TODO
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
/** * ByteHEXUtilsTest.java created by Dirac on
*/package com.into4g.service.util;&import static org.junit.Assert.*;&import org.junit.Before;import org.junit.Test;&/** * @author Dirac * @since
*/public class ByteHEXUtilsTest { private ByteHEXUtils utils; /** * @throws java.lang.Exception */ @Before public void setUp() throws Exception { utils = new ByteHEXUtils(); }& /** * Test method for {@link com.into4g.service.util.ByteHEXUtils#toHexString(byte[])}. * @throws Exception
*/ @Test public final void testToHexString() throws Exception { byte[] bytes = "岁月是把杀猪刀,人生任由他宰割。".getBytes("utf-8"); String data = utils.toHexString(bytes); System.out.println(data); assertTrue(true); //fail("Not yet implemented"); // TODO }& /** * Test method for {@link com.into4g.service.util.ByteHEXUtils#hexToByte(java.lang.String)}. */ @Test public final void testHexToByte() throws Exception{ byte[] data = utils.hexToByte("E5B281E69C88E698AFE68A8AE69D80E78CAAE58880EFBC8CE4BABAE7949FE4BBBBE794B1E4BB96E5AEB0E589B2E38082"); String str = new String(data, "utf-8"); System.out.println("str======="+str); //fail("Not yet implemented"); // TODO }}
你喜欢下面的文章吗!Do you like the following articles?
爱酷学习网博客 ,
IT视频教程交流学习
扫描二维码,手机访问网站

我要回帖

更多关于 侠盗猎车手5秘籍大全 的文章

 

随机推荐