最近,遇到一个很奇怪的问题
我的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[]的关系解析 在Java编程语言中,`String`对象与`byte[]`数组之间的转换是常见的操作之一。理解这两者之间的关系对于处理文本数据、网络通信及文件读写等任务至关重要。 #### 一、String与...
在Java和Android中,将字节数组转换为字符串最常用的方法是使用`new String(byte[])`构造函数。此方法会使用平台默认的字符编码,这可能会导致在不同系统上显示不同的结果。为了避免这个问题,我们通常指定一个明确...
在Java编程中,String对象和Byte类型的转换是常见的操作,特别是在网络编程中,因为网络通信通常涉及字节流的处理。下面将详细讲解Java中如何进行这两种类型之间的转换,并探讨其在网络编程中的应用。 首先,让我们...
mac地址的byte和string间的转换java类
### Java中String、十六进制String与byte[]之间的相互转换 在Java开发中,字符串(String)、十六进制表示的字符串以及字节数组(byte[])之间的转换是非常常见的需求,尤其是在处理网络通信、文件读写等场景下。...
java工具类 : string转10进制sacii byte数组、 10进制sacii byte数组转16进制字符数组、 16进制字符数组转16进制byte数组、 string与BCD互转等方法,包含多个转换方法, 足够满足日常解包组包需求
Java中byte[]、String、Hex字符串等转换的方法 Java中byte[]、String、Hex字符串等转换的...Java中byte[]、String、Hex字符串等转换的方法非常重要,需要我们详细了解和掌握这些方法,以便在实际开发中更好地应用。
用于java,byte与各种对象的转换,Integer、short、hex、string
"String 与 byte[] 之间的转换" String 与 byte[] 之间的转换...在 Java 中,可以使用 parseHexStr2Byte() 和 parseByte2HexStr() 方法来实现 String 与 byte[] 之间的转换,这两个方法可以确保数据的正确性和完整性。
在Java编程语言中,...总之,理解和掌握Java中String与各种进制字符之间的转换对于日常编程至关重要。通过熟练运用上述方法,可以轻松处理与进制相关的任务,无论是处理用户输入、解析文件内容还是与其他系统交互。
在Java编程中,经常需要处理图像数据,特别是在网络传输或存储时,将图像转换为`byte`数组是一种常见的做法。这不仅可以提高传输效率,还可以方便地进行存储。本文将详细介绍如何使用Java将图片转换为`byte`数组以及...
在Java编程语言中,编码和转换是至关重要的概念,特别是在处理字符集和处理不同编码格式的数据时。乱码问题通常是由于编码不一致或不当转换导致的。以下将详细阐述Java中涉及编码转换的关键知识点。 一、概念 1. ...
在Java或类似的编程语言中,我们经常会遇到需要将字符串(String)与字节数组(Byte[])以及十六进制表示的字符串(Hex)进行相互转换的情况。这些转换在处理网络通信、文件存储、加密解密等领域尤为关键。下面我们...
ipv6的byte【】和string间转换类实现及检查
Java 中的 String 类有很多特点和用途,本文将深入探讨 Java 中的 String 类。 一、String 类的本质 Java 中的 String 类是一个特殊的类,它是一个 immutable 类,也就是说,一旦创建了 String 对象,它的值就不能...
下面,我们将深入探讨如何在Java中实现图像数据与字节数组之间的相互转换,并分析这一过程中的关键步骤和技术细节。 ### 转换Image数据为byte数组 #### 方法一:`imageToBytes`函数解析 在Java中,将`Image`对象...
当我们使用蓝牙通信或者其他通信技术,常常需要用到数据之间的转换,此工具则是java收发蓝牙数据间的hexString 与byte之间的相互转化
网络请求时需要依赖okio.jar这个包,不然出现:Exception in thread "main" java.lang.NoClassDefFoundError: okio/ByteString
`String`类在Java中扮演着至关重要的角色,其丰富的功能和方法使得处理文本数据变得既方便又高效。理解并熟练掌握`String`类的构造函数和各种操作方法,对于任何Java程序员来说都是必不可少的技能。通过本文的介绍,...