Wie kann ich Bits in einem Bytearray iterieren?Java Iterate-Bits in Byte-Array
Antwort
Sie haben würden ein eigene Implementierung von Iterable<Boolean>
, die eine Reihe von Bytes nahm zu schreiben, und erstellt dann Iterator<Boolean>
Werte, die den aktuellen Index in den Byte-Array und der aktuellen Index innerhalb des aktuellen Byte erinnerten. Dann wird ein Dienstprogramm Methode, wie dies würde sich als nützlich erweisen:
private static Boolean isBitSet(byte b, int bit)
{
return (b & (1 << bit)) != 0;
}
(wo bit
im Bereich von 0 bis 7). Jedes Mal, wenn next()
aufgerufen wurde, müssten Sie Ihren Bit-Index innerhalb des aktuellen Bytes erhöhen und den Byte-Index innerhalb des Byte-Arrays erhöhen, wenn Sie "das 9. Bit" erreicht haben.
Es ist nicht wirklich hart - aber ein bisschen Schmerz. Lassen Sie mich wissen, wenn Sie eine Beispielimplementierung möchten ...
Sie können durch das Bytearray iterieren und für jedes Byte die bitweisen Operatoren verwenden, um seine Bits zu iterieren.
Original:
for (int i = 0; i < byteArray.Length; i++)
{
byte b = byteArray[i];
byte mask = 0x01;
for (int j = 0; j < 8; j++)
{
bool value = b & mask;
mask << 1;
}
}
oder Java mit Idiome
for (byte b : byteArray) {
for (int mask = 0x01; mask != 0x100; mask <<= 1) {
boolean value = (b & mask) != 0;
}
}
ich einige etwas in meiner Anwendung Streaming benötigt. Here können Sie meine BitArray-Implementierung finden. Es ist kein echtes Iteratormuster, aber Sie können 1-32 Bits vom Array auf Streaming-Art anfordern. Es gibt auch eine alternative Implementierung namens BitReader später in der Datei.
Eine Alternative wäre eine BitInputStream wie das verwenden Sie here und schreiben Code wie folgt finden:
BitInputStream bin = new BitInputStream(new ByteArrayInputStream(bytes));
while(true){
int bit = bin.readBit();
// do something
}
bin.close();
(Anmerkung:.-Code enthält keine EOFException oder IOException der Kürze der Handhabung)
Aber ich würde mit Jon Skeets Variante gehen und es alleine machen.
Ich weiß, wahrscheinlich nicht der "coolste" Weg, es zu tun, aber Sie können jedes Bit mit dem folgenden Code extrahieren.
int n = 156;
String bin = Integer.toBinaryString(n);
System.out.println(bin);
char arr[] = bin.toCharArray();
for(int i = 0; i < arr.length; ++i) {
System.out.println("Bit number " + (i + 1) + " = " + arr[i]);
}
Bitnummer 1 = 1
Bitnummer 2 = 0
Bitnummer 3 = 0
Bitnummer 4 = 1
Bitnummer 5 = 1
Bitnummer 6 = 1
Bitnummer 7 = 0
Bitnummer 8 = 0
Es ist cool, weil es diese "unheimlichen" bitweisen Operationen nicht nutzt. – Reginaldo
Ich sehe keine Notwendigkeit, den bitweisen Operator für etwas zu verwenden, das so einfach ist, wie das OP verlangt: iteriere durch die Bits. – amischiefr
Dies würde die Frage besser beantworten, wenn es zeigt, wie Bits aus einem * Byte-Array * (anstelle von String oder Char-Array) extrahiert werden – Jonik
public class ByteArrayBitIterable implements Iterable<Boolean> {
private final byte[] array;
public ByteArrayBitIterable(byte[] array) {
this.array = array;
}
public Iterator<Boolean> iterator() {
return new Iterator<Boolean>() {
private int bitIndex = 0;
private int arrayIndex = 0;
public boolean hasNext() {
return (arrayIndex < array.length) && (bitIndex < 8);
}
public Boolean next() {
Boolean val = (array[arrayIndex] >> (7 - bitIndex) & 1) == 1;
bitIndex++;
if (bitIndex == 8) {
bitIndex = 0;
arrayIndex++;
}
return val;
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
public static void main(String[] a) {
ByteArrayBitIterable test = new ByteArrayBitIterable(
new byte[]{(byte)0xAA, (byte)0xAA});
for (boolean b : test)
System.out.println(b);
}
}
- 1. Java - Größe der Komprimierungsausgabe-ByteArray
- 2. Konvertieren von ByteArray in UUID Java
- 3. Müssen PDF aus Bytearray (Java) erstellen
- 4. Hex byteArray
- 5. C#: Bytearray in XML speichern
- 6. PIL: Bytearray in Bild konvertieren
- 7. Converting ein Float in Bytearray
- 8. Android: conerting Bild in byteArray
- 9. Wie konvertiert man Bytearray zu Bild oder Bild zu Bytearray?
- 10. CryptoJS entschlüsseln (AES) eine Datei Bytearray aus Java
- 11. Datei aus Bytearray öffnen
- 12. Bytearray zu Bild asp.net
- 13. C# ByteArray zu Image
- 14. Sende ByteArray an JavaScript
- 15. von ByteArray zu BigInteger
- 16. Python byteArray Printing
- 17. Linux zu Windows C++ Bytearray
- 18. Bytearray von einer Webcam
- 19. Datatable.select mit Bytearray VB.NET
- 20. mit Bytearray mit socket.recv_into
- 21. VB.Net ByteArray Speicherleck
- 22. Konvertierung von JNI Java-Byte [] nach C++ Bytearray, Rückgabe 0
- 23. Hbase byteArray nach Long
- 24. .NET Encrypt Bytearray
- 25. wie zu response.write bytearray?
- 26. Bytearray von Oracle RAW in System.Guid konvertieren?
- 27. Konvertieren von Bitmap in ByteArray Android
- 28. Wie FLV-formatierte ByteArray in OSMF spielen?
- 29. Musik von Bytearray in HTML5 wiedergeben
- 30. Saving byteArray zu pdf-Datei in Titanium
Sie können nicht.Zumindest nicht direkt. Was versuchst du zu tun, vielleicht gibt es einen besseren Weg. Ein Byte-Array enthält eine Auflistung von Bytes. – OscarRyz
Und noch einmal wünsche ich, dass java.util.BitSet einen byte [] Konstruktor hatte. –
Es kann getan werden. Ich würde mit Jon Skeets Methode stimmen. In den meisten Fällen, wenn Sie mit Bits arbeiten, gibt es einige ausgefallene bitweise Operatoren, die Ihre Aufgabe viel schneller machen können. Wenn Sie uns genau sagen, was Sie gerade tun, können wir Ihnen helfen, einen besseren Weg zu finden, als die Bits zu wiederholen. – StriplingWarrior