将新元素插入字节数组

时间:2019-11-15 09:59:59

标签: java arrays for-loop iteration

private byte[] splitKeyAlgorithm(byte[] key) {
        var splitStream = 55;
        for (int i = 0, x = 0; i < key.length; i++, x++) {
            if (x == splitStream) {
                key[i] = '\n';
                x = -1;
            }
        }
        return key;
    }

我想通过新行字节'\ n'(splitStream)将字节数组拆分为相同长度的行。我的问题是:我在屏幕上有一个优雅的分割字节数组,但是 key [i] 表示的元素怎么办?被'\ n'覆盖吗?这是不可能的,因为我这样做:

Arrays.compare(original byte[], splitted byte[]);
Arrays.mismatch(original byte[], splitted byte[]);

以上代码返回这两个数组相等且没有任何不匹配。

编辑:// 比较如下:

Arrays.compare(List<ByteArrayOutputStream>outputStream.get(0).toByteArray(), primitive byte[] array);

4 个答案:

答案 0 :(得分:1)

是的,您现在正在破坏阵列。

相反,您应该为插入的字符创建一个具有足够额外字节的新数组:

int splitStream=55;
byte[] copy=new byte[key.length+key.length/splitStream];
int kidx=0,ccount=0;
for(int i=0;i<copy.length;i++){
  if(ccount==splitStream){
    ccount=0;
    copy[i]='\n';
  } else {
    ccount++;
    copy[i]=key[kidx];
    kidx++;
  }
}
return copy;

...可能,但我尚未对其进行测试。

现在我做到了。修复了count-ccount的错字,这里有一个测试:https://ideone.com/efDvE2

答案 1 :(得分:0)

您没有将'\ n'插入到数组中,而是覆盖了key [i]上的所有内容。

可能是Arrays.compare返回0(等于),因为这些位置上已经有\ n了?

答案 2 :(得分:0)

您正在覆盖同一数组。因此original == splitted

private byte[] splitKeyAlgorithm(byte[] key) {
    var lineLength = 55;
    int copyLength = key.length + key.length / lineLength;
    byte[] copy = new byte[copyLength];
    int ci = 0;
    for (int i = 0; i < key.length; i += lineLength) {
        int i2 = Math.min(i + lineLength, key.length);
        System.arraycopy(key, i, copy, ci, i2 - i);
        ci += i2 - i;
        if (ci < copy.length) {
            copy[ci++] = '\n';
        }
    }
    return copy;
}

答案 3 :(得分:0)

已解决。拆分前的原始数组被覆盖,原始数组和新数组上的元素byte [55] = 10,所以这是我的'\ n'。混淆是通过比较拆分后执行的操作,并且两个对象相同。对我来说很好的教训。感谢您提供所有答案。