最近,遇到一个很奇怪的问题
我的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());
分享到:
相关推荐
简单说说JAVA的String和byte[]的关系
mac地址的byte和string间的转换java类
java_byte与char、String互转.................
Java String与Byte类型转换;用到网络编程.
java工具类 : string转10进制sacii byte数组、 10进制sacii byte数组转16进制字符数组、 16进制字符数组转16进制byte数组、 string与BCD互转等方法,包含多个转换方法, 足够满足日常解包组包需求
java中String_十六进制String_byte[]之间相互转换
主要介绍了Java中byte[]、String、Hex字符串等转换的方法,代码很简单,需要的朋友可以参考下
用于java,byte与各种对象的转换,Integer、short、hex、string
当我们使用蓝牙通信或者其他通信技术,常常需要用到数据之间的转换,此工具则是java收发蓝牙数据间的hexString 与byte之间的相互转化
ipv6的byte【】和string间转换类实现及检查
网络请求时需要依赖okio.jar这个包,不然出现:Exception in thread "main" java.lang.NoClassDefFoundError: okio/ByteString
java String 与各种进制字符之间的转换
“字符与编码”是一个被经常讨论的话题,而时常出现的乱码对于... 而对于JAVA来说,在JSP输出、文件读写、甚至数据库访问等环节上,都有可能出现乱码现象,而之所以会出现乱码,都与编码及转码有着莫大的关系。。。
下面小编就为大家带来一篇java 将byte中的有效长度转换为String的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
java字节转换类和反转成String,可以转换String字符为byte类型进行加密
(转)java byte与char、String互转原理.pdf
2.String和byte[]之间的转换 getBytes() Arrays工具类 : Arrays.toString(names) String类 String replace(char oldChar, char newChar) String replace(CharSequence target, CharSequence replacement) ...
更好的解决了String类型与byte类型的转换,防止出现乱码问题
public static String loadAFileToStringDE1(File f) throws IOException { long beginTime = System.currentTimeMillis(); InputStream is = null; String ret = null; try { is = new BufferedInputStream( ...
byte转化工具类,可以实现byte转int,数组,string,小端取高位,低位等