【发布时间】:2012-11-06 14:32:40
【问题描述】:
我正在读取 Java 中的二进制文件,该文件在保存时是字节填充的,因此读取时必须反转操作。填充在于在FF 字节之后添加一个额外的零字节。读取时必须丢弃该零字节。我正在使用DataInputStream 来读取文件,尽管这不应该有太大的区别,看看我是如何只对程序的那一部分使用“原始”读取到数组函数的。
无论如何,这就是我目前所得到的:
public static byte[] unstuff(byte[] stuffed) {
int bytesToSkip = 0;
for(int i=0;i<stuffed.length - 1;++i) {
if(stuffed[i] == 0xFF && stuffed[i+1] == 0) {
++bytesToSkip;
}
}
if(bytesToSkip == 0) return stuffed;
byte unstuffed[] = new byte[stuffed.length - bytesToSkip];
int j=0;
for(int i=0;i<stuffed.length - 1;++i) {
if(stuffed[i] == 0xFF && stuffed[i+1] == 0) {
++i;
continue;
}
else {
unstuffed[j] = stuffed[i];
++j;
}
}
return unstuffed;
}
基本上,该函数计算要跳过的字节数,然后分配一个比原始填充数组短该字节数的数组,然后复制它们,跳过不需要的零字节。
问题是:有没有其他方法可以做到这一点,或许更流畅、更高效、更直接?将字节放在另一个容器中然后删除它们而不是复制整个数组会更好吗?
【问题讨论】:
-
在扫描数组时写入 byteArrayOutputStream,扫描输入数组后,使用
toByteArray()方法将 ByteArayOutputStream 转换为字节数组。 Incidenta;;y 为什么for(int i=0;i<stuffed.length - 1;++i) {你;在这里跳过最后一个字符。考虑一个包含 3 个元素的数组。它的长度为 3,索引为 0、1 和 2,因此您希望在i < array.length时继续,而不是i< length-1,因为这只会为 i = 0 和 i=1 提供 2 次迭代。 -
@SteveAtkinson 您的问题的答案在于
stuffed[i+1]。 -
假设数组总是以 FF 00 序列结尾,但没有说明 ;)
-
@SteveAtkinson 不,除了倒数第二个字节不是
ff的数组不以ff 00结尾这一显而易见的事实之外,它不会假设任何事情。
标签: java io binaryfiles