【问题标题】:How to combine two byte arrays [duplicate]如何组合两个字节数组[重复]
【发布时间】:2011-08-06 17:03:06
【问题描述】:

我有两个字节数组,我想知道如何将一个添加到另一个或组合它们以形成一个新的字节数组。

【问题讨论】:

  • 如果你添加它们那么你将如何处理溢出?
  • 你在哪里做任何添加?
  • 字节可以是 0-255,所以两个字节的总和会溢出范围。 (例如 255 + 1 = 256,溢出!)
  • @maerics:字节已签名(-128 到 127)。它们溢出回负范围。
  • 哦,对了,我忘了一切都是用Java签名的。但我想溢出还是溢出,对吧?

标签: java


【解决方案1】:

您只是想连接两个 byte 数组?

byte[] one = getBytesForOne();
byte[] two = getBytesForTwo();
byte[] combined = new byte[one.length + two.length];

for (int i = 0; i < combined.length; ++i)
{
    combined[i] = i < one.length ? one[i] : two[i - one.length];
}

或者你可以使用System.arraycopy:

byte[] one = getBytesForOne();
byte[] two = getBytesForTwo();
byte[] combined = new byte[one.length + two.length];

System.arraycopy(one,0,combined,0         ,one.length);
System.arraycopy(two,0,combined,one.length,two.length);

或者您可以使用List 来完成这项工作:

byte[] one = getBytesForOne();
byte[] two = getBytesForTwo();

List<Byte> list = new ArrayList<Byte>(Arrays.<Byte>asList(one));
list.addAll(Arrays.<Byte>asList(two));

byte[] combined = list.toArray(new byte[list.size()]);

或者您可以简单地使用 ByteBuffer 并具有添加许多数组的优势。

byte[] allByteArray = new byte[one.length + two.length + three.length];

ByteBuffer buff = ByteBuffer.wrap(allByteArray);
buff.put(one);
buff.put(two);
buff.put(three);

byte[] combined = buff.array();

【讨论】:

  • 或者你可以使用 System.arraycopy()
  • 好电话。我从没见过System.arraycopy();
  • 就我个人而言,我总是使用 System.arraycopy,通常使用包装方法来处理常见情况……实际上我早就写了一个 ArrayUtil.resize 方法。
  • Arrays.asList() 不适用于原始类型数组。这实际上怎么做?
  • 您不能将list.toArray(new byte[list.size()]) 与原始类型一起使用。相反,它应该是Byte[] combined = list.toArray(new Byte[list.size()])
【解决方案2】:

您可以通过使用 Apace 通用语言包 (org.apache.commons.lang.ArrayUtils class ) 来做到这一点。您需要执行以下操作

byte[] concatBytes = ArrayUtils.addAll(one,two);

【讨论】:

  • 快吗。我需要一个非常快速的方法。没有循环的开销。
  • 您对开销的恐惧使我认为您在执行此循环时会因 UI 冻结而感到困扰。也许您应该考虑使用AsyncTask (android),这是阻止循环中断您的 UI 线程的唯一方法。
【解决方案3】:

我认为这是最好的方法,

public static byte[] addAll(final byte[] array1, byte[] array2) {
    byte[] joinedArray = Arrays.copyOf(array1, array1.length + array2.length);
    System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
    return joinedArray;
}

【讨论】:

    【解决方案4】:
    String temp = passwordSalt;
    byte[] byteSalt = temp.getBytes();
    int start = 32;
    for (int i = 0; i < byteData.length; i ++)
    {
        byteData[start + i] = byteSalt[i];
    }
    

    您的代码的问题在于,用于索引数组的变量 i 超出了 byteSalt 数组和 byteData 数组。因此,请确保 byteData 的尺寸至少为 passwordSalt 字符串的最大长度加上 32。纠正它的方法是替换以下行:

    for (int i = 0; i < byteData.length; i ++)
    

    与:

    for (int i = 0; i < byteSalt.length; i ++)
    

    【讨论】:

      【解决方案5】:

      最简单方法(内联,假设a和b是两个给定的数组):

      byte[] c = (new String(a, cch) + new String(b, cch)).getBytes(cch);
      

      当然,这适用于两个以上的加法并使用串联字符集,在代码中的某处定义:

      static final java.nio.charset.Charset cch = java.nio.charset.StandardCharsets.ISO_8859_1;
      

      或者,更简单的形式,没有这个字符集:

      byte[] c = (new String(a, "l1") + new String(b, "l1")).getBytes("l1");
      

      但是你需要抑制UnsupportedEncodingException,这不太可能被抛出。


      最快方法:

      public static byte[] concat(byte[] a, byte[] b) {
          int lenA = a.length;
          int lenB = b.length;
          byte[] c = Arrays.copyOf(a, lenA + lenB);
          System.arraycopy(b, 0, c, lenA, lenB);
          return c;
      }
      

      【讨论】:

        【解决方案6】:

        假设您的 byteData 数组大于 32 + byteSalt.length()...您将达到它的长度,而不是 byteSalt.length。您正在尝试从数组末尾之外复制。

        【讨论】:

          【解决方案7】:

          我已经使用了这段代码,它工作得很好,只需执行 appendData 并通过一个数组传递一个字节,或者将两个数组组合起来:

          protected byte[] appendData(byte firstObject,byte[] secondObject){
              byte[] byteArray= {firstObject};
              return appendData(byteArray,secondObject);
          }
          
          protected byte[] appendData(byte[] firstObject,byte secondByte){
              byte[] byteArray= {secondByte};
              return appendData(firstObject,byteArray);
          }
          
          protected byte[] appendData(byte[] firstObject,byte[] secondObject){
              ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
              try {
                  if (firstObject!=null && firstObject.length!=0)
                      outputStream.write(firstObject);
                  if (secondObject!=null && secondObject.length!=0)   
                      outputStream.write(secondObject);
              } catch (IOException e) {
                  e.printStackTrace();
              }
              return outputStream.toByteArray();
          }
          

          【讨论】:

          • 酷评论 7 年后@Farid,感谢您的意见和恢复线程。
          猜你喜欢
          • 1970-01-01
          • 2012-09-02
          • 1970-01-01
          • 1970-01-01
          • 2011-10-07
          • 1970-01-01
          • 1970-01-01
          • 2016-06-18
          • 2020-02-22
          相关资源
          最近更新 更多