在进行Android的客户端和服务端的接口开发的过程中,笔者遇到这样的问题,因为采用的是流InputStream和OutputStream的操作,其中的参数都为byte型,在进行协议设计的时候,不可避免的需要将其转换为String类型,然后再在服务端进行识别并进行下一步的操作,但是在byte型转换为String类型的过程中,尝尝会出现乱码,开始笔者百思不得其解,后来根据Java Doc中关于String类型中toString()方法的说明,找到了相关的解决办法-使用String的构造函数,将byte类型的数组作为参数传入即可。
返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂。
建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
返回:
该对象的字符串表示形式。
详细的情况如下:
String类型的字符/字符串转换为byte型:
String s = "Hello,world";//定义字符串变量
byte [] b = new byte[1024];//初始化byte对象b
b = s.getBytes();//将字符串变量byte化,结果存在b中
b = s.getBytes(Charset charset);//charset的取值可以为
Charset | Description |
---|---|
US-ASCII | Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode character set |
ISO-8859-1 | ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1 |
UTF-8 | Eight-bit UCS Transformation Format |
UTF-16BE | Sixteen-bit UCS Transformation Format, big-endian byte order |
UTF-16LE | Sixteen-bit UCS Transformation Format, little-endian byte order |
UTF-16 | Sixteen-bit UCS Transformation Format, byte order identified by an optional byte-order mark |
b = s.getBytes(String charsetName);
b = getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin);
通过以上方法均可将一个String类型的字符串转变为byte类型,那么如何将byte类型的数组转化为String类型呢?
若使用:
String s1 = b.toString();则根据控制台打印的结果为:[B@de6ced,显然并不是我们需要得到的结果,那么这种情况下该如何做呢?
看看Java Doc中关于toString()函数的定义:
toString
public String toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂。
建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
返回:
该对象的字符串表示形式。
由上面的含义可知,使用b.toString()返回的是一个十六进制的无符号数,是一个哈希码,与我们需要得到的数据不同,故使用toString()方法是行不通的。
正确的方法是使用byte型数组作为一个参数,使用String构造一个字符串,即为String s1 = new String(b);即可。