Java 字节[]长度因环境而异
我需要在Java代码中有一个静态字节数组Java 字节[]长度因环境而异,java,byte,bytearray,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,
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\u GIF\u PIXEL.length
为我提供了43
,这正是我所期望的。
现在,如果我将代码上传到我的开发服务器(Debian),mvn包
并运行它,现在我得到的是35
,而不是预期的43
我想这与环境有关,但我真的不知道为什么会有不同,因为我在代码中明确定义了43个字节
我怎样才能保证无论环境如何,我都能得到我想要的东西呢?通常情况下,这些问题可能是由
- 当缓冲类组合在一起时,忘记了flush()
- 文本而不是二进制传输,丢弃CR,
0x0d
- 由C/C++读取,0x00为行尾
字符串
表示字节[]的味道
Java文本采用UnicodeString/char/Reader/Writer
。在C/C++中并非如此。
它区别于二进制数据字节[]
,这些数据总是采用某种编码方式。
因此,从/到字节的转换总是需要指定字节的编码
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上经常有UTF-8,一种Unicode多字节格式,因此更短,可能也有映射错误
我个人会选择一些长度,只使用byte[]
,而不使用从/到字符串的转换。
它也很容易出错。对于这样创建的数组在不同的机器上具有不同的长度,我想不出任何合理的解释。如果这真的发生了,那么这将是对Java语言规范的公然违反 在我看来,最有可能的解释是(出于某种原因)您在两个环境中执行的代码不同。例如,可能存在一个与类路径相关的问题,导致JVM在两个环境中获取不同版本的类(从不同版本的源代码编译)。或者您可能复制了错误的JAR文件。或者忘记复制JAR文件
另一种可能是你给我们看的代码是伪造的;i、 e.您的实际代码在某些重要方面有所不同。我也一样,除非您的代码在每台机器上都不相同。尝试使用
javap
转储生成的类。我也对这个问题感到震惊,所以我只是回答了你的问题,并在我的ubuntu机器上进行了尝试,结果如预期的那样是43。java的要点是:“写一次,到处运行”。在这些基本功能中,比如字节数组,没有任何区别。Stephen,谢谢,执行的代码确实与它与使用相同依赖项但在早期版本中的其他软件共享其jvm的代码不同。