Die Bits in einem Byte B
sind beispielsweise 10000010
: Wie kann ich die Bits der Zeichenfolge str
buchstäblich zuweisen , d str = "10000010"
. H.
Bearbeiten
Ich habe das Byte aus einer Binärdatei gelesen und im Byte-Array gespeichert B
. Ich benutze System.out.println(Integer.toBinaryString(B[i]))
. das Problem ist
(a) Wenn die Bits mit (ganz links) 1 beginnen, ist die Ausgabe nicht korrekt, da sie B[i]
in einen negativen int-Wert konvertiert wird.
(b) Wenn die Bits mit beginnen 0
, ignoriert die Ausgabe 0
beispielsweise B[0]
00000001, die Ausgabe ist 1
anstelle von00000001
byte
in eine Zeichenfolge in Basis 2 konvertieren können ?Boolean
,Byte
,Short
,Char
,Int
, undLong
. stackoverflow.com/a/54950845/501113Antworten:
Verwendung
Integer#toBinaryString()
:DEMO .
quelle
B
. Ich benutzeSystem.out.println(Integer.toBinaryString(B[i]))
. Wenn ich diese Methoden verwende, ist das Problem (a) wenn die Bits mit (ganz links) 1 beginnen, ist die Ausgabe nicht korrekt, da sieB[i]
in einen negativen int-Wert konvertiert wird. (b) Wenn die Bits mit 0 beginnen, die Ausgabe ignorieren0
, zum Beispiel annehmen,B[0]
hat00000001
, ist die Ausgabe1
anstelle von00000001
byte
in Java eine 8-Bit-Zweierkomplement-Ganzzahl mit Vorzeichen ist. Sein Minimalwert ist -128 (2 ^ 8) und sein Maximalwert ist127
; b) Sie können dies leicht beheben, indem SieString.format("%8s", Integer.toBinaryString(b)).replace(' ', '0')
die resultierende Zeichenfolge mit Nullen links auffüllen.&
mit0xFF
.& 0xFF
wandelt im Grunde asigned byte
in ein umunsigned integer
. Zum Beispiel wird-129
, wie Sie sagten, dargestellt durch11111111111111111111111110000001
. In diesem Fall möchten Sie im Grunde die ersten (niedrigstwertigen) 8 Bits, also UND (&
) mit0xFF
(00000000000000000000000011111111
), um die Einsen auf der linken Seite, die uns egal sind, effektiv zu reinigen und einfach wegzulassen10000001
.Ich habe das benutzt. Ähnliche Idee wie bei anderen Antworten, aber nirgendwo genau gesehen :)
0xFF
ist 255 oder11111111
(Maximalwert für ein vorzeichenloses Byte).0x100
ist 256 oder100000000
Das
&
überträgt das Byte auf eine Ganzzahl. An diesem Punkt kann es alles sein von0
-255
(00000000
bis11111111
, ich habe die führenden 24 Bits ausgeschlossen).+ 0x100
und stellen Sie.substring(1)
sicher, dass es führende Nullen gibt.Ich habe es im Vergleich zu João Silvas Antwort zeitlich festgelegt , und das ist mehr als zehnmal schneller. http://ideone.com/22DDK1 Ich habe Pshemos Antwort nicht aufgenommen, da sie nicht richtig aufgefüllt ist.
quelle
b
ist1
, ohne+ 0x100
Sie erhalten nur"1"
als Ihre Zeichenfolge. Durch Hinzufügen erhalten1
Sie100000001
, und wenn Sie den Teilstring nehmen und das erste Zeichen ignorieren, erhalten Sie das richtige"00000001"
. Wenn Sie nicht möchten, dass Ihre Zeichenfolge aufgefüllt wird, können Sie sie einfach verwendenInteger.toBinaryString(b & 0xff)
. Das& 0xff
behebt die Komplementprobleme der Negativen / ZweiSuchst du danach?
Konvertieren von String in Byte
Konvertieren von Byte in String
Oder wie João Silva in seinem Kommentar zum Hinzufügen von führenden Zeichen sagte,
0
können wir die Zeichenfolge auf Länge 8 formatieren und die resultierenden führenden Leerzeichen durch Null ersetzen, also im Falle einer Zeichenfolge, wie" 1010"
wir sie erhalten"00001010"
quelle
Sie können jedes Bit im Byte überprüfen und dann entweder 0 oder 1 an eine Zeichenfolge anhängen. Hier ist eine kleine Hilfsmethode, die ich zum Testen geschrieben habe:
quelle
Holen Sie sich jedes Bit Byte und konvertieren Sie es in einen String. Angenommen, Byte hat 8 Bits, und wir können sie einzeln durch Bitverschiebung erhalten. Zum Beispiel verschieben wir das zweite Bit des Bytes um 6 Bits nach rechts, das zweite Bit zuletzt um das Bit mit 8 Bits und dann (&) mit 0x0001, um die vorderen Bits zu reinigen.
quelle
Dieser Code zeigt, wie ein Java-Int in seine 4 aufeinander folgenden Bytes aufgeteilt werden kann. Wir können dann jedes Byte mit Java-Methoden im Vergleich zur Abfrage von Bytes / Bits auf niedriger Ebene untersuchen.
Dies ist die erwartete Ausgabe, wenn Sie den folgenden Code ausführen:
Hier ist der auszuführende Code:
quelle
quelle
Tut mir leid, dass ich weiß, dass dies etwas spät ist ... Aber ich habe einen viel einfacheren Weg ... Zur binären Zeichenfolge:
getCorrectBits-Methode:
quelle
quelle
Wir alle wissen, dass Java so etwas wie das nicht signierte Schlüsselwort nicht bereitstellt. Darüber hinaus
byte
repräsentiert ein Grundelement gemäß der Java-Spezifikation einen Wert zwischen−128
und127
. Zum Beispiel, wenn einebyte
istcast
mit einemint
Java wird die erste interpretierenbit
als diesign
und die Verwendung Vorzeichenerweiterung.Wie konvertiere ich dann ein Byte, das größer ist als
127
in seine binäre Zeichenfolgendarstellung?Nichts hindert Sie daran, ein
byte
einfaches 8-Bit anzuzeigen und diese Bits als Wert zwischen0
und zu interpretieren255
. Außerdem müssen Sie bedenken, dass Sie nichts tun können, um Ihre Interpretation der Methode eines anderen aufzuzwingen. Wenn eine Methode a akzeptiertbyte
, akzeptiert diese Methode einen Wert zwischen−128
und127
sofern nicht ausdrücklich anders angegeben.Der beste Weg, dies zu lösen, besteht darin, den
byte
Wert in einenint
Wert umzuwandeln, indem Sie dieByte.toUnsignedInt()
Methode aufrufen oder alsint
Grundelement umwandeln(int) signedByte & 0xFF
. Hier haben Sie ein Beispiel:Ausgabe
quelle
Sie können mit BigInteger wie im folgenden Beispiel arbeiten, insbesondere wenn Sie 256 Bit oder länger haben:
Ein weiteres Beispiel, das Bytes akzeptiert:
Ergebnis:
Sie können auch daran arbeiten, das Binärformat in das Byte- Format zu konvertieren
Hinweis: Für die Formatierung von Zeichenfolgen für Ihr Binärformat können Sie das folgende Beispiel verwenden
quelle
Ich rate hier nur, aber wenn Sie ein Byte haben, können Sie dann nicht einfach toString () für das Objekt aufrufen, um den Wert zu erhalten? Oder mit byteValue () auf die API blicken?
quelle