`
ldjsyl
  • 浏览: 192449 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java中的byte和String

    博客分类:
  • java
阅读更多
最近,遇到一个很奇怪的问题
我的byte[]数组byte1从一个接口传来的数据:-2,0,0,79,.......
我将字节转为String
String strResult = new String(byte1,0,2);
得到的strResult却不是-2
后来在网上查了一下,原来是这样的:
String 的 getbyte 方法如果没指定 encoding
是用系统默认的。
如果你是在中文系统下,就是 GBK。
这时虚拟机就将那些 bytes 看成是字符的 GBK 表示,
要寻找这些字对应的 UNICODE。。
GBK 是 DBMS 编码,
也就是,小于 0x80 的,这个 byte 就是一个字符,跟 ASCII 的意义相同;
>= 0x80 的,就将该byte跟下一个byte合起来,两个bytes表示一个字符。当然这里有较多细节,如并非所有的 2-bytes 都表示有意义的字符等等。
还有是某个标准规定,
如果转换过程中找不到对应字符的,就用 ? 代替。
在获得新的byte[] byte2

后来在网上找到一个byte和String之间的方法:
问题1:java中没有实现这种“byte a = 0xB2 --> String b = “B2””转换的简单实现需要自己实现。 
答:自己编写的转换函数,思路将byte的高低4位分开,分别转换为对应的字符然后合成返回的字符串。 
public static String byteToString(byte b) { 
byte high, low; 
byte maskHigh = (byte)0xf0; 
byte maskLow = 0x0f; 

high = (byte)((b & maskHigh) >> 4); 
low = (byte)(b & maskLow); 

StringBuffer buf = new StringBuffer(); 
buf.append(findHex(high)); 
buf.append(findHex(low)); 

return buf.toString(); 
} 

private static char findHex(byte b) { 
int t = new Byte(b).intValue(); 
t = t < 0 ? t + 16 : t; 

if ((0 <= t) &&(t <= 9)) { 
return (char)(t + '0'); 
} 

return (char)(t-10+'A'); 
} 

未解决的疑问在java中不存在类似C中的无符号量,所以如果一个字节超过0x80其对应的整型值即为负值,但在高位右移4位后还是负值,且与对应的正值相差16,比如0xB2经过右移后的期望值是0x0B(11)但实际值是-5与预期的值相差16(这个16通过多次试验得出),对此现象为找到合理的解释。 


问题2:“String a=”B2” --> byte b=0xB2”字符的byte转换为byte数据类型 
答:思路通过Integer作为转换的中间桥梁 
public static int stringToByte(String in, byte[] b) throws Exception { 
if (b.length < in.length() / 2) { 
throw new Exception("byte array too small"); 
} 

int j=0; 
StringBuffer buf = new StringBuffer(2); 
for (int i=0; i<in.length(); i++, j++) { 
buf.insert(0, in.charAt(i)); 
buf.insert(1, in.charAt(i+1)); 
int t = Integer.parseInt(buf.toString(),16); 
System.out.println("byte hex value:" + t); 
b[j] = (byte)t; 
i++; 
buf.delete(0,2); 
} 

return j; 
} 

问题3:整数(表示范围限定为两个字节unsigned short)通过Integer.byteValue()转换成byte[2],如果超出一个byte的表示范围将会截断高位的值。 
答:思路一个byte能表示的最大整数为256(超过128为负值,超过256将被截断),所以取256的倍数为byte[0],256的余数为byte[1]。 
byte[] d = new byte[l+2]; 
…. 
buff.put(new Integer(l/256).byteValue()); 
buff.put(new Integer(l%256).byteValue());
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics