`
ldjsyl
  • 浏览: 195782 次
  • 性别: 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());
分享到:
评论

相关推荐

    简单说说JAVA的String和byte[]的关系

    ### JAVA中String与byte[]的关系解析 在Java编程语言中,`String`对象与`byte[]`数组之间的转换是常见的操作之一。理解这两者之间的关系对于处理文本数据、网络通信及文件读写等任务至关重要。 #### 一、String与...

    Android byte[] 和 String互相转换

    在Java和Android中,将字节数组转换为字符串最常用的方法是使用`new String(byte[])`构造函数。此方法会使用平台默认的字符编码,这可能会导致在不同系统上显示不同的结果。为了避免这个问题,我们通常指定一个明确...

    Java String与Byte类型转换

    在Java编程中,String对象和Byte类型的转换是常见的操作,特别是在网络编程中,因为网络通信通常涉及字节流的处理。下面将详细讲解Java中如何进行这两种类型之间的转换,并探讨其在网络编程中的应用。 首先,让我们...

    mac地址的byte和string转换

    mac地址的byte和string间的转换java类

    java中String_十六进制String_byte[]之间相互转换

    ### Java中String、十六进制String与byte[]之间的相互转换 在Java开发中,字符串(String)、十六进制表示的字符串以及字节数组(byte[])之间的转换是非常常见的需求,尤其是在处理网络通信、文件读写等场景下。...

    java工具类 string转10进制sacii byte数组再转16进制字符数组再转16进制byte数组 string与BCD互转

    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[]、String、Hex字符串等转换的方法非常重要,需要我们详细了解和掌握这些方法,以便在实际开发中更好地应用。

    java byte转换工具类

    用于java,byte与各种对象的转换,Integer、short、hex、string

    String 与byte[] 间的转换

    "String 与 byte[] 之间的转换" String 与 byte[] 之间的转换...在 Java 中,可以使用 parseHexStr2Byte() 和 parseByte2HexStr() 方法来实现 String 与 byte[] 之间的转换,这两个方法可以确保数据的正确性和完整性。

    java String 与各种进制字符之间的转换

    在Java编程语言中,...总之,理解和掌握Java中String与各种进制字符之间的转换对于日常编程至关重要。通过熟练运用上述方法,可以轻松处理与进制相关的任务,无论是处理用户输入、解析文件内容还是与其他系统交互。

    Java将图片转换为byte数组例子总结

    在Java编程中,经常需要处理图像数据,特别是在网络传输或存储时,将图像转换为`byte`数组是一种常见的做法。这不仅可以提高传输效率,还可以方便地进行存储。本文将详细介绍如何使用Java将图片转换为`byte`数组以及...

    关于java中的编码转换问题(解决乱码问题)

    在Java编程语言中,编码和转换是至关重要的概念,特别是在处理字符集和处理不同编码格式的数据时。乱码问题通常是由于编码不一致或不当转换导致的。以下将详细阐述Java中涉及编码转换的关键知识点。 一、概念 1. ...

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

    在Java或类似的编程语言中,我们经常会遇到需要将字符串(String)与字节数组(Byte[])以及十六进制表示的字符串(Hex)进行相互转换的情况。这些转换在处理网络通信、文件存储、加密解密等领域尤为关键。下面我们...

    ipv6转换string和byte

    ipv6的byte【】和string间转换类实现及检查

    深入探讨Java中的String类.pdf

    Java 中的 String 类有很多特点和用途,本文将深入探讨 Java 中的 String 类。 一、String 类的本质 Java 中的 String 类是一个特殊的类,它是一个 immutable 类,也就是说,一旦创建了 String 对象,它的值就不能...

    转换Image数据为byte数组

    下面,我们将深入探讨如何在Java中实现图像数据与字节数组之间的相互转换,并分析这一过程中的关键步骤和技术细节。 ### 转换Image数据为byte数组 #### 方法一:`imageToBytes`函数解析 在Java中,将`Image`对象...

    hexString与byte互转

    当我们使用蓝牙通信或者其他通信技术,常常需要用到数据之间的转换,此工具则是java收发蓝牙数据间的hexString 与byte之间的相互转化

    okio-1.6.0.jar

    网络请求时需要依赖okio.jar这个包,不然出现:Exception in thread "main" java.lang.NoClassDefFoundError: okio/ByteString

    Java的String类

    `String`类在Java中扮演着至关重要的角色,其丰富的功能和方法使得处理文本数据变得既方便又高效。理解并熟练掌握`String`类的构造函数和各种操作方法,对于任何Java程序员来说都是必不可少的技能。通过本文的介绍,...

Global site tag (gtag.js) - Google Analytics