com.sta.mutils.ByteArrayUtils Maven / Gradle / Ivy
package com.sta.mutils;
/**
* Name: ByteArrayUtils
* Description: .
*
* Comment: ...
*
* Copyright: Copyright (c) 2019, 2020
* Company: >StA-Soft<
* @author StA
* @version 1.0
*/
public final class ByteArrayUtils
{
/**
* Pr?fen, ob in einem Byte-Array ab einer bestimmten Position der Inhalt eines anderen Bytes-Arrays enthalten ist.
* @param buf das erste Byte-Array
* @param offs Index in erstes Byte-Array
* @param mask das zweite Byte-Array
* @return true: ja/gleich, false: nein/ungleich
*/
public static boolean equals(byte[] buf, int offs, byte[] mask)
{
if (offs + mask.length > buf.length)
{
return false;
}
for (int i = 0; i < mask.length; i++)
{
if (buf[offs + i] != mask[i])
{
return false;
}
}
return true;
}
/**
* Suche nach dem Vorkommen des Inhalts eines Byte-Arrays in einem anderen Byte-Array.
* @param buf zu durchsuchendes Byte-Array
* @param offs Start-Offset (Beginn der Suche an diesem Index)
* @param mask Byte-Array mit Suchmuster
* @return Index in Byte-Array, falls vorhanden, sonst -1
*/
public static int find(byte[] buf, int offs, byte[] mask)
{
// wichtig ist hier das "<=" im for-Konstrukt!!!
for (int i = offs; i <= buf.length - mask.length; i++)
{
if (equals(buf, i, mask))
{
return i;
}
}
return -1;
}
/**
* Suche nach dem Vorkommen des Inhalts eines Byte-Arrays in einem anderen Byte-Array.
* @param buf zu durchsuchendes Byte-Array
* @param mask Byte-Array mit Suchmuster
* @return Index in Byte-Array, falls vorhanden, sonst -1
*/
public static int find(byte[] buf, byte[] mask)
{
return find(buf, 0, mask);
}
/**
* Suchen und ggf. Ersetzung aller Vorkommen eines Byte-Arrays in einem zu durchsuchenden Byte-Array (ab Array-Anfang).
* Hinweis: Dadurch werden auch Vorkommen des Musters gefunden, die durch eine Ersetzung vor oder innerhalb der
* Ersetzungsstelle entstehen, gefunden.
* @param buf zu durchsuchendes Byte-Array
* @param mask Byte-Array mit Suchmuster
* @param repl Byte-Array mit Ersetzung
* @return Ergebnis-Byte-Array nach Ersetzung (falls etwas gefunden wurde, sonst = urspr?ngliches Byte-Array)
*/
public static byte[] replace(byte[] buf, byte[] mask, byte[] repl)
{
int i;
int offs = 0;
while ((i = find(buf, offs, mask)) >= 0)
{
byte[] ba1 = new byte[buf.length - mask.length + repl.length];
System.arraycopy(buf, 0, ba1, 0, i);
System.arraycopy(repl, 0, ba1, i, repl.length);
System.arraycopy(buf, i + mask.length, ba1, i + repl.length, buf.length - (i + mask.length));
buf = ba1;
}
return buf;
}
/**
* Suchen und ggf. Ersetzung aller Vorkommen eines Byte-Arrays in einem zu durchsuchenden Byte-Array nach der letzten
* Ersetzungs-Anfangsstelle.
* Hinweis: Dadurch werden Vorkommen des Musters, die vor der letzten Ersetzungsstelle durch das Ersetzen entstehen, nicht
* gefunden. Daf?r l?uft die Suche und Ersetzung in replace2(...) schneller als in replace(...).
* @param buf zu durchsuchendes Byte-Array
* @param mask Byte-Array mit Suchmuster
* @param repl Byte-Array mit Ersetzung
* @return Ergebnis-Byte-Array nach Ersetzung (falls etwas gefunden wurde, sonst = urspr?ngliches Byte-Array)
*/
public static byte[] replace2(byte[] buf, byte[] mask, byte[] repl)
{
int i;
int offs = 0;
while ((i = find(buf, offs, mask)) >= 0)
{
byte[] ba1 = new byte[buf.length - mask.length + repl.length];
System.arraycopy(buf, 0, ba1, 0, i);
System.arraycopy(repl, 0, ba1, i, repl.length);
System.arraycopy(buf, i + mask.length, ba1, i + repl.length, buf.length - (i + mask.length));
buf = ba1;
offs = i + 1;
}
return buf;
}
/**
* Suchen und ggf. Ersetzung aller Vorkommen eines Byte-Arrays in einem zu durchsuchenden Byte-Array nach der letzten
* Ersetzungs-Endstelle.
* Hinweis: Dadurch werden Vorkommen des Musters, die vor der letzten Ersetzungsstelle durch das Ersetzen entstehen, nicht
* gefunden. Ebenso werden Vorkommen des Musters, die innerhalb der Ersetzungsstelle durch das Ersetzen entstehen, nicht gefunden.
* Daf?r l?uft die Suche und Ersetzung in replace3(...) nochmals schneller als in replace(...) und replace2(...).
* @param buf zu durchsuchendes Byte-Array
* @param mask Byte-Array mit Suchmuster
* @param repl Byte-Array mit Ersetzung
* @return Ergebnis-Byte-Array nach Ersetzung (falls etwas gefunden wurde, sonst = urspr?ngliches Byte-Array)
*/
public static byte[] replace3(byte[] buf, byte[] mask, byte[] repl)
{
int i;
int offs = 0;
while ((i = find(buf, offs, mask)) >= 0)
{
byte[] ba1 = new byte[buf.length - mask.length + repl.length];
System.arraycopy(buf, 0, ba1, 0, i);
System.arraycopy(repl, 0, ba1, i, repl.length);
System.arraycopy(buf, i + mask.length, ba1, i + repl.length, buf.length - (i + mask.length));
buf = ba1;
offs = i + repl.length;
}
return buf;
}
//===========================================================================
/**
* Dummy-Constructor.
*/
private ByteArrayUtils()
{
}
}