Was macht diese Funktion?
-
es geht darum, die Hex-Werte für die nibbles rauszuziehen. Also: Ein Byte hat 8 Bit, das sind 2 Nibbles mit jeweils 4 Bit. Nehmen wir das Byte
0xAB
, schieben 4 Bit nach rechts raus (bit-shift) und legen die Maske 0xF darüber:0xAB >> 4 & 0xF
so erhalten wir 0xA (nibble links) und um das rechte nibble zu kriegen wenden wir einfach nur die Maske 0xF an, also0xAB & 0xF
so erhalten wir 0xB für das rechte nibble.Tags: Bitoperatoren und Bitmaske.
MFG
-
@omggg sagte in Was macht diese Funktion?:
Alles.
Wenn du einzelne Dinge in einzelnen Zeilen nicht verstehst, helfe ich gerne, wenn du genau sagst, was "alles" ist. Ist es das
[j++]
? Ist es das&
? Ist es das>> 4
?Ich dachte, das Ding wandelt eine Dezimalzahl (bzw. Binärzahl) in eine Hexadezimalzahl um und gibt dann einen String zurück. Nein?
Die Eingabe ist doch ein
final byte[] data
(in Java) bzw. dasunsigned char data[]
in C. Als eine beliebig lange Kette von irgendwelchen Bytes. Das können Binärdaten sein, Strings, Zahlen, ... - dieser Funktion ist das egal, sie guckt nur auf die Bytes.Und diese werden dann einzeln nach Hex umgewandelt und dann in den übergebenen Speicherbereich reingeschrieben.
-
Keine Fragen mehr.
Edit: Doch eine noch. Steht im Ergebnis nun die Hexadezimal-Repräsentation der Zahl als String oder nicht
?
-
das Ergebnis von Bit-Shift ist immer ein Integer.
MFG
Edit: Das war in JavaScript immer der Geheimtipp um an den Integer-Teil einer float zu kommen:
3.9 >> 0
ergibt genau 3.
-
-
glauben heißt nicht wissen
-
Informatiker machen nur selten absolute Aussagen.
Aber vielleicht sollte ich das einfach mal ausprobieren:
public class MyClass { private static char[] encodeHex(final byte[] data, final int dataOffset, final int dataLen, final char[] toDigits, final char[] out, final int outOffset) { // two characters form the hex value. for (int i = dataOffset, j = outOffset; i < dataOffset + dataLen; i++) { out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; out[j++] = toDigits[0x0F & data[i]]; } return out; } public static void main(String args[]) { byte[] data = {123}; int dataOffset = 0; int dataLen = data.length; char[] toDigits = "0123456789abcdef".toCharArray(); char[] out = new char[dataLen * 2]; int outOffset = 0; encodeHex(data, dataOffset, dataLen, toDigits, out, outOffset); System.out.println(new String(out)); // -> 7b } }
https://www.jdoodle.com/ia/11T6
@_ro_ro Du hast Dich geirrt, es wandelt in die Hex-Schreibweise um.
-
@omggg sagte in Was macht diese Funktion?:
Du hast Dich geirrt, es wandelt in die Hex-Schreibweise um.
Ein Integer ist es dennoch
-
@_ro_ro sagte in Was macht diese Funktion?:
@omggg sagte in Was macht diese Funktion?:
Du hast Dich geirrt, es wandelt in die Hex-Schreibweise um.
Ein Integer ist es dennoch
Eigentlich, ein Zeichen-Array
Aber ja, im Prinzip ist alles, was um uns herum ist und wir sehen, nur eine Zahl.
-
achja und noch etwas: auch eine integer-Maske liefert den integer-Anteil einer Zahl.
3.9 & 0xFF
ergibt 3.Und wie man hex-Strings in Zahlen und umgekehrt umwandelt weiß Du ja jetzt
mfg
-
JavaScript != Java
Aber in diesem Fall ein schöner Hack...
Schönen Abend allerseits gewünscht!
-
der Hack geht auch in Perl und in PHP. Wer schreibt hier eigentlich von wem ab!?
Schönen Sonntag
-
@_ro_ro sagte in Was macht diese Funktion?:
Wer schreibt hier eigentlich von wem ab!?
Immer der, der fragt
Schönen Sonntag!
-
In the Hex.encodeHex method, the two lines within the loop:
out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; out[j++] = toDigits[0x0F & data[i]];
do the following:
-
Convert the upper 4 bits of data[i] to a hexadecimal character and store it in out.
-
ListenpunktConvert the lower 4 bits of data[i] to a hexadecimal character and store it in out.
A C equivalent would be:
char hexDigits[] = "0123456789abcdef"; void encodeHex(const unsigned char* data, int dataLen, char* out) { for (int i = 0, j = 0; i < dataLen; ++i) { out[j++] = hexDigits[(data[i] & 0xF0) >> 4]; out[j++] = hexDigits[data[i] & 0x0F]; } }
This function performs the same conversion from bytes to hexadecimal characters.
-
-
Vermutlich nur ein weiterer Account von Martin gewesen ...