Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中膨胀字节[]时出现问题?_Java_Windows_Linux_Byte_Inflate - Fatal编程技术网

在Java中膨胀字节[]时出现问题?

在Java中膨胀字节[]时出现问题?,java,windows,linux,byte,inflate,Java,Windows,Linux,Byte,Inflate,我遇到了一个我搞不懂的问题。以下是问题的定义: 我在Db2/Linux环境中的Blob列中有一些数据。Blob是在使用JDK压缩(在Linux环境中运行的代码)压缩字节[]之后写入DB2的。 我正试图编写一个简单的程序来读取这些数据(使用JDK)并在Windows环境(我的开发环境)中从解压缩的字节数组中创建一个字符串。问题是在解压Blob(字节[])后,解压字节数组的长度通常比预期的长1-3个字节。我所说的“预期”是指偏移量和长度字段也存储在数据库中。所以在这种情况下,解压缩字节数组的长度通常

我遇到了一个我搞不懂的问题。以下是问题的定义: 我在Db2/Linux环境中的Blob列中有一些数据。Blob是在使用JDK压缩(在Linux环境中运行的代码)压缩字节[]之后写入DB2的。 我正试图编写一个简单的程序来读取这些数据(使用JDK)并在Windows环境(我的开发环境)中从解压缩的字节数组中创建一个字符串。问题是在解压Blob(字节[])后,解压字节数组的长度通常比预期的长1-3个字节。我所说的“预期”是指偏移量和长度字段也存储在数据库中。所以在这种情况下,解压缩字节数组的长度通常比数据库中存储的长度长,只有几个字节。因此,如果我从解压缩的字节数组创建一个字符串对象,并使用数据库中的offset和length字段使用substring(offset,length)方法创建另一个字符串对象,那么我的第二个字符串(使用substring方法得到的字符串)会更短

例如: 数据库记录包含一个blob,偏移量:0,长度:260409 解压水滴后-

 compressedByte[].length  - 71,212
 decompressedByte[].length   - 260,412
 new String(decompressByte[]).length()  - 260,412
 new String(decompressByte[]).subString(0, 260,409).length() - 260409
对于其他一些输入记录,我看到的差异是长度在1-3字节之间


我对这个问题有点困惑,不知道是否有人能给我一些建议,这样我就可以做更多的调试来解决这个问题。我想知道这是否与Linux环境中字节的存储/写入方式以及Windows中字节的读取方式有关?谢谢您的帮助。

字符串不是字节的通用持有者。毫无疑问,db2/Linux环境和Windows环境之间的默认字符编码不同,这将导致字节和字符之间的来回转换不同。

我怀疑这两个系统之间的默认编码不同

// on the linux box   
byte [] blob = str.getBytes("UTF-8");

// in your code 
String str = new String(blob, "UTF-8");
或者至少找出linux机器上的默认编码是什么(正常的UTF-8)并跳过步骤1


这里发生的事情的一个很好的例子是

是的,就是这样,它的编码不同。谢谢你的回答。使用新字符串(字节[],“UTF-8”)修复了该问题。今晚我会读那篇文章——看起来里面有很多好信息。太糟糕了,我不能投票支持这个答案,因为我还没有足够的声誉。你可以投票支持你自己的问题(我想),你也可以点击那个大勾号将这个答案标记为接受答案。Joels Artial是道达尔黄金,基本上是必读的。请注意,有大量字节序列无法使用UTF-8字符编码解码为字符。您最好使用US-ASCII,它将执行直接的1对1映射。或不要使用字符串作为字节的保持符一致同意UTF-8可能不是每种情况下最合适的编码,但如果您要将字符串转换为字节数组,我强烈建议不要使用US-ASCII,除非您确定字符串不包含任何超过128的字符。请注意,对于这样的字符串,UTF-8输出无论如何都是相同的。这取决于原始数据是否为字符串。如果您是从byte[](例如JPG或其他)开始的,请不要靠近字符串,或者,如果必须的话,请使用ISO-8859-1(我不是指上面的US-ASCII,您是对的,这是一个7位字符集)。如果您从字符串开始并试图通过字节[],则使用UTF-8。