【问题标题】:inserting new element into byte array将新元素插入字节数组
【发布时间】:2019-11-15 09:59:59
【问题描述】:
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);

【问题讨论】:

  • 它被\n的char值覆盖。如果之前那个地方没有\n(不是,因为\n10 而不是55),那么这两个数组不相等(除非它们都是空的)。

标签: java arrays for-loop iteration


【解决方案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

【讨论】:

  • 有道理,但拆分前后两个数组相等。
  • @Matthew 查看ideone.com/efDvE2 上的完整测试,它似乎没有丢失数据(整个序列幸存下来,加上换行符出现)。
  • 是的,我看到了。谢谢,但我找不到我的问题的答案。我的数组是否相等:第一个 - 拆分之前,第二个 - 拆分之后。什么?
【解决方案2】:

您正在覆盖同一个数组。因此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】:

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

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

    【讨论】:

    • 不可能。传递给该方法的字节数组是用 BASE64 编码的随机 RSA 算法。
    【解决方案4】:

    解决了。拆分前的原始数组被覆盖,原始数组和新数组上的元素字节 [55] = 10,所以这是我的 '\n'。混淆是通过比较哪个是在拆分后执行的并且两个对象是相同的。对我来说很好的一课。谢谢大家的回答。

    【讨论】:

    • 好收获。澄清一下,这里只有一个 byte[] 对象,originalsplitted 都指向它。因此,比较将始终匹配。您需要克隆/复制数组对象以执行真正的前后比较。
    猜你喜欢
    • 2013-01-24
    • 2012-10-18
    • 2018-03-02
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    相关资源
    最近更新 更多