Konvertiert 4-Byte-int -
Bin ich beim Lesen einer Binär-Datei wie folgt:
InputStream in = new FileInputStream( file );
byte[] buffer = new byte[1024];
while( ( in.read(buffer ) > -1 ) {
int a = //???
}
Was ich tun will, es zu Lesen, bis zu 4 bytes, und erstellen Sie ein int-Wert von denen, aber, ich weiß nicht, wie es zu tun.
Ich habe das Gefühl, ich muss packen 4 Byte zu einem Zeitpunkt, und führen Sie eine "byte" - Betrieb ( wie >> << >> & FF und sowas ) zum erstellen der neuen int
Was ist das idiom dafür?
BEARBEITEN
Ooops diese ein bisschen komplexer ( zu erklären )
Was ich versuche zu tun ist, Lesen Sie eine Datei ( ascii -, Binär -, ist es egal ), und extrahieren Sie die zahlen, die es haben kann.
Beispielsweise angenommen, die binären Inhalte ( Basis 2 ) :
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000010
Die integer-Darstellung sollte 1
, 2
Recht? :- /1 für die ersten 32 bits, und 2 für die restlichen 32 bits.
11111111 11111111 11111111 11111111
Wäre -1
und
01111111 11111111 11111111 11111111
Wäre Integer.MAX_VALUE ( 2147483647 )
InformationsquelleAutor der Frage OscarRyz | 2010-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
ByteBuffer hat diese Fähigkeit und ist in der Lage, die Arbeit mit little-und big-endian-Integer.
Betrachten Sie dieses Beispiel:
Hoffe, das hilft.
InformationsquelleAutor der Antwort Tom
Sollten Sie es in eine Funktion wie diese:
Beispiel:
Ausgabe:
Dieser kümmert sich um das laufen von bytes, die korrekt und Umgang mit negativen byte-Werte.
Ich bin mir nicht bewusst eine standard-Funktion, dies zu tun.
Aspekte zu berücksichtigen:
Endianness: verschiedenen CPU-Architekturen setzen Sie das Byte eines int in verschiedenen Ordnungen. Je nachdem, wie Sie kommen mit dem byte-array, um mit zu beginnen, die Sie haben können, zu sorgen; und
Pufferung: wenn Sie greifen 1024 bytes zu einer Zeit und starten Sie eine Sequenz-element 1022 Sie trifft das Ende des Puffers, bevor Sie um 4 bytes. Es ist wahrscheinlich besser, verwenden Sie irgendeine form von gepufferten Eingabestream wird, werden die gepufferten automatisch, so können Sie einfach
readByte()
wiederholt und Sie sich keine sorgen machen sonst;Trailing-Puffer: das Ende der Eingabe kann eine ungerade Anzahl von bytes (auch nicht ein Vielfaches von 4, explizit) in Abhängigkeit von der Quelle. Aber wenn Sie die Eingabe beginnen, und die ein Vielfaches von 4 ist "garantiert" (oder zumindest Voraussetzung) können Sie nicht brauchen, um Bedenken Sie sich mit ihm.
näher auf den Punkt der Pufferung, sollten die
BufferedInputStream
:Nun haben Sie ein
InputStream
dass automatisch Puffer von 1024 Byte zu einem Zeitpunkt, das ist viel weniger umständlich zu handhaben. Auf diese Weise können Sie gerne Lesen 4 bytes zu einer Zeit, und sich keine sorgen über zu viel I/O.Zweitens können Sie auch verwenden,
DataInputStream
:oder auch:
haben und sich keine Gedanken über den Bau
int
s bei allen.InformationsquelleAutor der Antwort cletus
Wenn Sie diese bereits in ein byte[] array, die Sie verwenden können:
Quelle: hier
InformationsquelleAutor der Antwort iTEgg
nur noch sehen, wie DataInputStream.readInt() implementiert ist;
InformationsquelleAutor der Antwort Santhosh Kumar Tekuri
Der einfachste Weg ist:
-- oder --
InformationsquelleAutor der Antwort Taylor Leese
probieren Sie etwas wie dieses:
dies ist unter der Annahme, dass der niedrigste byte zuerst kommt. wenn das höchste byte zuerst kommt, die Sie haben könnten, um die swap-Indizes (gehen von 0 bis 3).
grundsätzlich für jedes byte, das Sie hinzufügen möchten, multiplizieren Sie zunächst eine von 256 (das entspricht einer Verschiebung nach Links um 8 bits) und fügen Sie dann die neue byte.
InformationsquelleAutor der Antwort stmax
InformationsquelleAutor der Antwort Andrey
Können Sie auch verwenden, BigInteger für die variable "length" - Byte. Sie können konvertieren Sie es zu Lange, Integer oder Short, je nachdem, was Ihren Bedürfnissen entspricht.
oder zu bezeichnen, Polarität:
InformationsquelleAutor der Antwort Jamel Toms
Zum Lesen unsigned 4 Byte als integer-wir sollten nutzen, Sie eine long variable, da das Vorzeichen-bit betrachtet wird, als Teil der Zahl ohne Vorzeichen.
Getestet habe ich dies gut funktionierte Funktion
InformationsquelleAutor der Antwort Mounir