Die Gewinnung bestimmter bits von binären Daten
Habe ich eine binäre Zahl, die wie folgt aussieht:
00000000 00000000 00000011 00001101 = 781 integer Wert = integer name "verpackt"
Wie bin ich in der Lage, extrahieren Sie alle diese als getrennte integer-Werte mit bit-wise in java. Wie die folgenden:
int a = (function) = 00000000;
int b = (function) = 00000000;
int c = (function) = 00000011;
int d = (function) = 00001101;
Wenn Sie sehen können, was ich Tue, bis es.. ich will die ersten 8 in eine Ganzzahl am nächsten zu einem zweiten integer und so weiter.. ich denke, Sie tun dies mit bit-wise in java, aber ich bin völlig unsicher. Jede Hilfe ist willkommen. Sorry, aber ich bin völlig neu auf diese Art der Sache und brauche wirklich Hilfe mit diesem, vielen Dank! Grundsätzlich (Funktion) soll gleich so etwas wie dieses:
packed >> 5; (I know this isn't nearly right that is why i am needing help on this)...
Diese Frage beantwortet war für mich vor 2 Tagen und es funktionierte perfekt in Ordnung, aber jetzt ist es kaputt... ich habe KEINE Ahnung warum.. hier ist die Methode, die ich verwendet, dies zu tun:
public static int getNthByte(int n, int packed)
{
//shift the desired bits into the last 8 bits
int shifted = packed >> (8 * n);
//and now get those bits
int masked = 0x000000FF & shifted;
return masked;
}
Aber wenn ich diese code-Zeile: ich bekomme diese Antwort:
int x = 781;
System.out.println(getNthByte(3, x)); (Which should give me 00001101, in integer value)
Ich printlns die folgenden:
0
Warum? Dies funktionierte gut für mich gestern... aber mir ist aufgefallen Wenn ich das getan habe:
System.out.println(getNthByte(5, x));
Er gab mir die 3. bit:
3
Das war richtig...
tl;dr diese Methode funktioniert wurde gestern nun es ist alles Durcheinander und ich brauche Hilfe es zu beheben oder vielleicht ist es mein Fehler? Ich weiß nicht.. Gestern habe ich in getNthByte(3,x), und es gab mir die richtigen integer-Wert bezogen auf 00001101...
Jede Hilfe ist geschätzt.. vielleicht gibt es etwas falsch mit der Methode? oder geht es nur mir so?
- Versuchen Sie, alle vier bytes der Funktion (
n
= 0, 1, 2 & 3). Sie möglicherweise feststellen, dass Sie das zählen von verschiedenen enden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn in Java, Sie haben für den Umgang mit binären Daten, in einem Wort, sollten pop zu Ihrem Verstand sofort:
ByteBuffer
:Rücksendung der N-te byte ist jetzt so einfach wie:
Beachten Sie, dass Sie davon ausgehen, dass Ihr integer im big-endian-Ordnung; zum Glück, du hast Recht: das ist der Fall in Java. Immer. Unabhängig von der endianness der zugrunde liegenden Architektur.
Wie geschrieben, Ihre Funktion und Sie liefert die richtige Antwort. Das 3. byte (beginnend von rechts) ist
00000000
. Da haben Sie Recht Verschiebung in der Anzahl von 8*n bit, dann und-Verknüpfung mit0xFF
Sie bekommen, was Sie wollte.Wenn Sie die shift-rechts mit einer Zahl, die größer als 32 (5*8 = 40), es scheint, dass der compiler übernimmt nur die unteren fünf bits, die Anzahl (oder, wenn Sie wollen,
40%32 = 8
) und macht die Rechte shift mit, der. SogetNthByte(5, x)
ist das gleiche wiegetNthByte(5%4, x)
ist das gleiche wiegetNthByte(1, x)
die Verschiebungen der Anzahlx
rechts um 8 bit, dann schaut auf den unteren 8 bit.Ich bin verwirrt, warum Sie dachte, dass
getNthByte(5,x)
sollte jemals zurückkehren, das Dritte byte. Wie haben Sie von fünf auf drei? Oder war es ein Tippfehler?Ich denke, dass Sie einfach vergessen haben, was Ihre Funktion haben.
Haben Sie bestanden in
3
für die byte, die Sie wollen, aber nach deiner LinieDass eine Verlagerung der 24 bits nach rechts, so es ist immer die ersten byte, nicht auf das Letzte byte.
Spiegeln die Vorstellung von Ihrem byte-Reihenfolge, subtrahieren
n
aus3
vor der Multiplikation mit8
:So, dass man in 3 wird in einem shift von 0-bits, um das "least significant byte (00001101), anstelle des "most significant byte".
Oder, wenn Ihre Leitung wirklich repräsentieren die Reihenfolge, die Sie wollen, übergeben Sie einfach in
0
statt: