So kombinieren Sie zwei Byte-Arrays [duplicate]

Lesezeit: 5 Minuten

Benutzer-Avatar
NovizePrgrmr

Ich habe zwei Byte-Arrays und frage mich, wie ich das eine zum anderen hinzufügen oder zu einem neuen Byte-Array kombinieren würde.

  • Wenn Sie sie hinzufügen, wie würden Sie dann mit dem Überlauf umgehen?

    – Maerik

    16. April 2011 um 0:05 Uhr

  • Wo machst du irgendwelche Ergänzungen?

    – Oliver Charlesworth

    16. April 2011 um 0:07 Uhr

  • Bytes können 0-255 sein, sodass die Summe von zwei Bytes den Bereich überschreiten kann. (zB 255 + 1 = 256, Überlauf!)

    – Maerik

    16. April 2011 um 0:14 Uhr

  • @maerics:Bytes sind signiert (-128 bis 127). Sie laufen wieder in den negativen Bereich über.

    – Markus Peters

    16. April 2011 um 0:18 Uhr

  • Oh, richtig, ich habe vergessen, dass alles in Java signiert ist. Aber ich nehme an, Überlauf ist immer noch Überlauf, oder?

    – Maerik

    16. April 2011 um 0:28 Uhr

Benutzer-Avatar
pickypg

Sie versuchen nur, die beiden zu verketten byte Arrays?

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];
}

Oder Sie könnten verwenden 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);

Oder Sie könnten einfach eine verwenden List um die Arbeit zu machen:

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()]);

Oder Sie könnten einfach verwenden ByteBuffer mit dem Vorteil, viele Arrays hinzuzufügen.

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();

  • Oder Sie könnten System.arraycopy() verwenden

    – Lawrence Dol

    16. April 2011 um 0:42 Uhr

  • Guter Anruf. Ich hatte noch nie gesehen System.arraycopy();

    – wählerisch

    16. April 2011 um 0:48 Uhr

  • Und ich persönlich benutze immer System.arraycopy, oft mit Wrapper-Methoden für den Normalfall… eigentlich habe ich schon lange eine geschrieben ArrayUtil.resize Methode.

    – Lawrence Dol

    16. April 2011 um 0:50 Uhr

  • Arrays.asList() funktioniert nicht mit einem Array primitiver Typen. Wie kann das eigentlich getan werden?

    – Snacküberlauf

    2. August 2018 um 12:02 Uhr

  • Sie können nicht verwenden list.toArray(new byte[list.size()]) mit primitiven Typen. Stattdessen sollte es sein Byte[] combined = list.toArray(new Byte[list.size()])

    – Ilker Katze

    27. September 2018 um 10:20 Uhr

Benutzer-Avatar
CJPro

Sie können dies tun, indem Sie das Common Lang-Paket von Apace (org.apache.commons.lang.ArrayUtils Klasse ). Sie müssen Folgendes tun

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

  • Ist es schnell. Ich brauche eine wirklich schnelle Methode. Ohne Schleifenaufwand.

    – Anna

    1. Oktober 2014 um 5:26 Uhr

  • Ihre Angst vor Gemeinkosten lässt mich denken, dass Sie durch das Einfrieren Ihrer Benutzeroberfläche beunruhigt sind, wenn Sie diese Schleife ausführen. Vielleicht sollten Sie eine in Betracht ziehen AsyncTask (Android), was die einzige Möglichkeit ist, eine Schleife daran zu hindern, Ihren UI-Thread zu unterbrechen.

    – 1owk3y

    27. Juli 2015 um 13:14 Uhr

Ich denke, es ist der beste Ansatz,

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;
}

String temp = passwordSalt;
byte[] byteSalt = temp.getBytes();
int start = 32;
for (int i = 0; i < byteData.length; i ++)
{
    byteData[start + i] = byteSalt[i];
}

Das Problem mit Ihrem Code hier ist, dass die Variable i, die zum Indizieren der Arrays verwendet wird, sowohl das Array byteSalt als auch das Array byteData passiert. Stellen Sie also sicher, dass byteData so dimensioniert ist, dass es mindestens die maximale Länge der Zeichenfolge passwordSalt plus 32 hat. Was es korrigieren wird, ist das Ersetzen der folgenden Zeile:

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

mit:

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

Das einfachste Methode (inline, vorausgesetzt a und b sind zwei gegebene Arrays):

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

Dies funktioniert natürlich mit mehr als zwei Summanden und verwendet einen Verkettungszeichensatz, der irgendwo in Ihrem Code definiert ist:

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

Oder einfacher ohne diesen Zeichensatz:

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

Aber man muss unterdrücken UnsupportedEncodingException die wahrscheinlich nicht geworfen wird.


Das am schnellsten Methode:

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;
}

Benutzer-Avatar
Michael K

Angenommen Ihr byteData Array ist größer als 32 + byteSalt.length()… du gehst zu seiner Länge, nicht byteSalt.length. Sie versuchen, von jenseits des Array-Endes zu kopieren.

Benutzer-Avatar
Jeremia D

Ich habe diesen Code verwendet, der ganz gut funktioniert, einfach appendData und entweder ein einzelnes Byte mit einem Array oder zwei Arrays übergeben, um sie zu kombinieren:

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();
}

  • cooler Kommentar 7 Jahre später @Farid, danke für deinen Beitrag und die Wiederbelebung des Threads.

    – Jeremie D

    3. Januar um 15:54 Uhr


1187220cookie-checkSo kombinieren Sie zwei Byte-Arrays [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy