我需要在我的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个字节而有所不同。
无论环境如何,我如何保证完全符合我的期望?
答案 0 :(得分:1)
对于在不同机器上创建不同长度的数组,我可以想到没有合理的解释。如果真的发生这种情况,那么它将公然违反Java语言规范。
IMO,最可能的解释是(由于某种原因)您没有在两个环境中执行相同的代码。例如,可能存在与类路径相关的问题,该问题导致JVM在两个环境中拾取不同版本的类(从源代码的不同版本编译)。或者您可能复制了错误的JAR文件。或者忘记复制JAR文件。
另一种可能性是你向我们展示的代码是制作;即你的实际代码在某些重要方面有所不同。
答案 1 :(得分:0)
通常这些问题可能来自
flush()
0x0d
。在你的情况下,它有点使用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。
它也容易出错。