今天在Android上测试压缩和解压缩。 获得压缩后的byte[]数组后,直接用 byte[].toString()方法取得字符串。

然后用这个字符串再反向来解压缩,还原数据。却发现还原回来的字符串有误。

    String str = "这是一个用于测试的字符串";

        try {
/*
* 压缩
*/
ByteArrayOutputStream out = new ByteArrayOutputStream();
ZipOutputStream zout = new ZipOutputStream(out); zout.putNextEntry(new ZipEntry("0")); zout.write(str.getBytes());
zout.closeEntry();
byte[] compressed = out.toByteArray(); // 返回压缩后的字符串的字节数组
Log.d(TAG,"compressed String" + compressed.toString());
/*
* 解压
*/
ByteArrayOutputStream rout = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(compressed);
ZipInputStream zin = new ZipInputStream(in);
zin.getNextEntry();
byte[] buffer = new byte[1024];
int offset = -1;
while ((offset = zin.read(buffer)) != -1) {
rout.write(buffer, 0, offset);
}
byte[] uncompressed = rout.toByteArray(); // 返回解压缩后的字符串的字节数组
Log.d(TAG,"uncompressed String" + uncompressed.toString()); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
打出的不是字符串数据,而是类签名:
compressed String[B@42eabfb8
uncompressed String[B@42eaeb90

byte[]字节数组的toString()获得的字符串,和使用new String(byte[]) 构造一个新的字符串。得出的结果不同。

Java对象都继承于Object,Object中提供了toString方法,用于简单返回该类的类签名。在Java中,数组也可以看作是一种对象,显然byte[]也是一种继承与Object的对象,并且它没有重写Object的toString方法,因此使用byte[]的toString返回的字符串,仅仅是byte[]的类签名,而不是对应的值。

改为使用new String()构造方法,将byte[]转换为字符串,得到的就会是一个根据字节数组内容构造的字符串。

Log.d(TAG,"compressed String" + new String(compressed));
Log.d(TAG,"uncompressed String" + new String(uncompressed));

输出:

compressed StringPKԀ�F0$��这是一个用于测试的字符串P�j��)$
uncompressed String这是一个用于测试的字符串

byte[] 的toString() 和 new String(byte[]) 的区别的更多相关文章

  1. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

  2. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

  3. new String(byte[])和byte[]toString() 的区别

    byte[]字节数组的toString()获得的字符串和使用new String(byte[])构造一个新的字符串,这两个字符串是不一样的.Java对象都继承于Object,Object中提供了toS ...

  4. byte和hexstring,int,string等的转换类

    public class HexConversion { /** * 16进制数的字符串转字节数组(16进制转字节数组) * * @param hexString * 16进制字符串 * @retur ...

  5. 用java String类的getBytes(String charsetName)和String(byte[] bytes, String charsetName)解决乱码问题

    Java中String的数据是如何存储的,查看源代码就可以知道,String的数据是存储在char[] value这样一个成员变量中的,char类型的大小在java中是2个字节 我们还知道,现在普遍使 ...

  6. String(byte[] bytes, String charsetName)

    String str = new String("时之沙"); byte bytes[] = str.getBytes("GBK"); byte byte2[] ...

  7. byte[]->new String(byte[]) -> getByte()引发的不一致问题

    今天接短信接口,短信接口提供了sdk,我们可以直接用sdk发送请求然后发送对应短信. 但是想使用我们平台自定义的httpUtil实现. 然而忙了1天半,才解决这个问题,还是我同事帮忙找出问题并解决的. ...

  8. InputStream转换为String, byte[] data = new byte[1024]详解

    /** * This file created at 2018年2月28日. * * Copyright (c) 2002-2018 Bingosoft, Inc. All rights reserv ...

  9. C#string byte[] base64位互相转换

    byte表示字节,byte[]则表示存放一系列字节的数组 1个字符=2个字节(byte) 1个字节=8个比特(bit) 网速上所说的1M其实是指1兆的小b,1M= 1024b/8 = 128kb 下面 ...

随机推荐

  1. 1、html(),text(),value()的区别;2、remove() 3、加载完执行函数

    1 .html()用为读取和修改元素的HTML标签.2  .text()用来读取或修改元素的纯文本内容.3  .val()用来读取或修改表单元素的value值. 这三个方法功能上的对比 .html() ...

  2. Node.js模块、包的学习笔记

    什么是模块 模块是node应用程序的基本组成部分,文件和模块是一一对应的,就是说,一个node文件就是一个模块,这个文件可能是javascript代码.json或者是编译过的c++扩展等,如: var ...

  3. QBXT Day 4 数学,数论

    今天讲一讲数论吧(虽然清明讲过了) 进制转换 我们来看10这个数怎么转换成k进制 因为10=2^3+2^1,所以10就是1010 三进制也同理10=3^2+3^0,所以就是101 我们对于一个10进制 ...

  4. poj2289二分图多重匹配

    题意:给你一张二分图,求右边点到汇点的最小容量(保证流量为n)是多少 题解:二分答案,每次重新建边跑最大流,看是不是为n就好了 #include<map> #include<set& ...

  5. zoj3229 有源汇上下界最大流

    题意:有一个人每天给妹子拍照,每个妹子有最少拍照数,每天有最大拍照数,每天只能给某些特定的妹子拍照,求最大拍照数 题解:很容易看出来的有源汇上下界最大流,对于有源汇 的上下界最大流,我们按照无源汇的操 ...

  6. 大数据框架对比:Hadoop、Storm、Samza、Spark和Flink——flink支持SQL,待看

    简介 大数据是收集.整理.处理大容量数据集,并从中获得见解所需的非传统战略和技术的总称.虽然处理数据所需的计算能力或存储容量早已超过一台计算机的上限,但这种计算类型的普遍性.规模,以及价值在最近几年才 ...

  7. LeetCode OJ:Lowest Common Ancestor of a Binary Search Tree(最浅的公共祖先)

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  8. Codeforces Round #254(div2)B

    就是看无向图有几个连通块,答案就是2n-num. 范围很小,就用矩阵来存图减少代码量. #include<iostream> #include<cstdio> #include ...

  9. Object 的一个问题

    var s1 = 'abc';     s1 instanceof String //false var s2 = new String('abc');     s2 instanceof Strin ...

  10. svn代码回滚命令 svn up -r

    第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn revert [-R] something 其中so ...