byte []长度不一样取决于环境

时间:2014-10-09 09:21:28

标签: java byte bytearray

我需要在我的Java代码中有一个静态字节数组。

    public static final byte[]  TRANSPARENT_GIF_PIXEL   = {
        0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x01, 0x00, 0x01, 0x00,
        (byte) 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x21,
        (byte) 0xf9, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00,
        0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x40, 0x02, 0x02, 0x44,
        0x01, 0x00, 0x3b
    };

在我的测试中,在带有Windows 7的Eclipse下通过JUnit本地运行,TRANSPARENT_GIF_PIXEL.length给了我43这就是我所期望的。 现在,如果我将我的代码上传到我的开发服务器(Debian),mvn package并运行它,现在我得到35而不是预期的43

我想这与环境有关,但我真的不知道为什么这会因为我在代码中明确定义了43个字节而有所不同。

无论环境如何,我如何保证完全符合我的期望?

2 个答案:

答案 0 :(得分:1)

对于在不同机器上创建不同长度的数组,我可以想到没有合理的解释。如果真的发生这种情况,那么它将公然违反Java语言规范。

IMO,最可能的解释是(由于某种原因)您没有在两个环境中执行相同的代码。例如,可能存在与类路径相关的问题,该问题导致JVM在两个环境中拾取不同版本的类(从源代码的不同版本编译)。或者您可能复制了错误的JAR文件。或者忘记复制JAR文件。


另一种可能性是你向我们展示的代码是制作;即你的实际代码在某些重要方面有所不同。

答案 1 :(得分:0)

通常这些问题可能来自

  • 缓冲课程合并时忘记了flush()
  • 文字而非二进制转移,丢弃CR,0x0d
  • 被C / C ++读取,而0x00则有行尾。

在你的情况下,它有点使用String用于byte []。

Java文本采用Unicode String/char/Reader/Writer。在C / C ++中并非如此。 它区分了二进制数据byte[],它们总是处于某种编码状态。 因此,从/到总是的转换需要指定字节所在的编码。

byte[] b = ...
String s = new String(b); // Default platform encoding, non-portable
String s = new String(b, StandardCharsets.ISO_8859_1);
b = s.getBytes(); // Default platform encoding, non-portable
b = s.getBytes(StandardCharsets.ISO_8859_1);

在Windows上有一个单字节编码,因此1个字节= 1个字符。 在Linux oftern上有UTF-8,一种Unicode多字节格式,因此更短,也可能是映射错误。

我个人会花一些时间来使用byte[],而无需从/转换为String。 它也容易出错。