Discussion:
Hexadezimalzahl in Java
(zu alt für eine Antwort)
Thümmler
2003-08-06 15:40:55 UTC
Permalink
Hallo Gruppe,

ich möchte an einen Server einen Bytestream schicken. Die Verbindung
ist TCP Socket. Soweit ist das kein Problem. Die Verbindung steht, ich
kann mit dem Server kommunizieren. Nun verlangt der Server einen
speziellen Bytestream. Unter anderem muß ich Hexadezimalzahlen
schicken.

Beispiel: Ich muß 4 Bytes schicken, in denen jeweils Hexadezimal "00"
steht. (Für jemand, der REXX beherrscht: Da macht man das so:
'00000000'x)

So, nun weiß ich zwar, dass man mit Integer.toHexString(60) die
Hex-Zahl von 60 als String bekommt, jedoch ist das ja nicht in einem
Byte.

Wie kann ich das in Java lösen? Braucht man da Bitmanipulation?

Vielen Dank.
Torsten Thümmler
Klaus Mueller
2003-08-06 15:55:27 UTC
Permalink
Erwartet der ein Byte (ok, vier davon), das den Wert Null hat oder
erwartet er einen String, der Null entspricht (entweder "00" oder
"0x00")?

Klaus
Joerg Glande
2003-08-06 19:59:48 UTC
Permalink
Hi,
Post by Klaus Mueller
erwartet er einen String, der Null entspricht (entweder "00" oder
"0x00")?
Was bedeutet denn ein String der Null entspricht? Ein String der 0
entspricht oder ein String der "null" entspricht? Ich hab das jetzt
schon haeufiger mal gesehen, dass Zahlen z.B. als x300 bezeichnet
werden, aber ich hab keine Ahnung was das bedeutet, sondern wuerde eher
denken, dass wenn ich einem String einen Zahlenwert zuordne also z.B.
String bsp = "100"; den dann ueber eine Methode in einen Integer oder
was auch immer umwandle. Kannst du etwas genauer erklaeren, was du
meinst? Wuerde mich naemlich sehr interessieren.

Dank und Gruss
Joerg
Marco Schmidt
2003-08-06 20:53:16 UTC
Permalink
Post by Joerg Glande
Post by Klaus Mueller
erwartet er einen String, der Null entspricht (entweder "00" oder
"0x00")?
Was bedeutet denn ein String der Null entspricht?
Meinst Du jetzt

String s =
(a) null;
(b) "null";
(c) "0";

Oder 0x00 (byte/short/int/char/long)?

Oder noch was anderes?

Gruß,
Marco
--
Bitte nur in der Newsgroup antworten, nicht per Email!
de.comp.lang.java Homepage: http://www.dclj.de/
FAQ: http://www.faqs.org/faqs/de/comp-lang-java/faq/
Meine Java-Seiten: http://www.geocities.com/marcoschmidt.geo/java.html
Joerg Glande
2003-08-07 07:21:21 UTC
Permalink
Hi,
Post by Marco Schmidt
Oder 0x00 (byte/short/int/char/long)?
Ja. Genau das. Was ist 0x00 fuer eine Darstellung von Zahlen und
wofuer braucht man die, bzw. wann ist es sinnvoll, Zahlen so
darzustellen?
Falls es zu kompliziert ist, dass zu erklaeren, waere auch schon ein
Stichwort zum Googeln ziemlich prima.

Danke
Joerg
Marco Schmidt
2003-08-07 18:34:07 UTC
Permalink
Post by Joerg Glande
Ja. Genau das. Was ist 0x00 fuer eine Darstellung von Zahlen und
wofuer braucht man die, bzw. wann ist es sinnvoll, Zahlen so
darzustellen?
0x ist eine andere Darstellung eines Ganzzahlenwert. Statt nur die
Ziffern 0 - 9 (Basis 10) werden zusätzlich noch die Buchstaben a bis f
verwendet (Basis 16).

Damit kann man Zahlen etwas kompakter darstellen - eine Stelle
entspricht vier Binärstellen (16 = 2 hoch 4). Bei einer längeren Zahl
(etwa 16-Bit-Integerwert) kann man der Hexadezimaldarstellung ansehen,
in welche Bytes der Wert zerteilt werden kann. 65534 (dezimal) ist
0xfffe, also sind die entsprechenden Bytes 0xff 0xfe.

Außerdem gibt es bei Java noch die Darstellung zur Basis 8 (oktal).
Damit werden nur 0 - 7 als Ziffern verwendet. Solche Zahlenliterale
werden durch eine führende 0 gekennzeichnet: 0123 gleich 1 * 8 * 8 + 2
* 8 + 3 = 64 + 16 + 3 = 83.

Solange Du keinen Vorteil in den Schreibweisen siehst, benutze sie
einfach nicht. Ist natürlich wichtig sie zu verstehen, wenn man sie in
vorhandenem Code sieht.

Gruß,
Marco
--
Bitte nur in der Newsgroup antworten, nicht per Email!
de.comp.lang.java Homepage: http://www.dclj.de/
FAQ: http://www.faqs.org/faqs/de/comp-lang-java/faq/
Meine Java-Seiten: http://www.geocities.com/marcoschmidt.geo/java.html
Thümmler
2003-08-07 00:42:04 UTC
Permalink
"Klaus Mueller" wrote ...
Post by Klaus Mueller
Erwartet der ein Byte (ok, vier davon), das den Wert Null hat oder
erwartet er einen String, der Null entspricht (entweder "00" oder
"0x00")?
Klaus
Hallo Klaus,

der Server erwartet ein Byte mit dem Wert Null. Wie ich das hinbekomme
weiß ich jetzt. (Ich habe mich so auf die Hexadezimale '00' versteift,
da dies unter REXX so gemacht wird).

So, nun aber zu dem nächsten Problem in dieser Ecke:

Ich versuche es an einem Beispiel zu erklären. Der Server verlangt,
dass zu Beginn eines jeden Byte-Streams, den ich ihm sende, die Anzahl
der Daten-Bytes, die im folgenden gesendet werden, als Hex-Wert
gesendet wird. Dafür sind die ersten 4 Bytes reserviert. Möchte ich
zum Beispiel 1000 Bytes Daten übertragen, so werde ich zuerst 4 Bytes
schicken, die ich folgendermaßen initialisiere:

byte[] header = {0x00,0x00,0x03,(byte) 0xE8}

1000 in Hex ist 3E8.
Der Server würde dann die ersten 32 Bit auswerten, um auf die Anzahl
zu kommen. In meinem Bsp. würde der dann wohl so ausshen: 0000 0000
0000 0000 0000 1100 0111 0001

Da ich im Code natürlich nicht die 1000 fest verdrahten möchte,
brauche ich also eine Funktion, der ich sage, welche Zahl in der oben
beschriebenen Schreibweise mit wieviel Bytes dargestellt werden soll.

sowas wie: alsHexInBytes(1000, 4) für das obige Beispiel.

Gibt es sowas schon? Wie hoch ist der Umsetzungsaufwand, wenn man
selbst sowas schreibt?

Danke.
Torsten
Marco Rothe
2003-08-07 09:06:21 UTC
Permalink
int length = 1000;
out.writeInt (length);
sollte reichen.
Dann müsste er aber einen DataOutputStream über seinen OutputStream stülpen
bloß um einen einzigen Int zu schreiben. Ich denke da kommt er besser, wenn
er gleich das Int mittels Shift-Operatoren "zurechtgerückt" in den OutStream
schiebt, oder?

...
OutputStream out = socket.getOutputStream();
int length = 1000;
out.write((v >>> 24) & 0xFF);
out.write((v >>> 16) & 0xFF);
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
//write other data ...

Gruß Marco Rothe
Marco Rothe
2003-08-08 09:45:24 UTC
Permalink
Dieses "Überstülpen" mag ja vom subjektivem Standpunkt etwas ganz
unhandliches für Java sein,
vom technischen Aspekt ist es weder mit Performanceeinbußen noch
Speicherplatzverbrauch verbunden.
Nein, finde ich nicht wirklich unhandlich. Wenn man schon mal Streams in C
hatte... *g*
Es ist eine feine Sache in Java unterschiedliche Verhaltensweisen &
Bearbeitungsweisen von Stream auf diese Weise zu erreichen.
Aber nur um einen int vor einen Haufen Binärdaten zu schreiben rechtfertigen
für mich kaum die Objekterzeugung, meinst du nicht, daß da meine 3 Zeilen
evt. doch "hübscher" sind - zumal man dann vielleicht sogar ein bischen
hinter die Arbeitsweise von Dingen wie DataOutputStream schaut? :)
Außerdem kümmert sich der
DataOutputStream gleich noch um die richtige Reihenfolge der Bytes.
Mein Code auch. Er ähnelt sogar verblüffend der Implementierung von
DataOutputStream.writeInt() ;))


Gruß Marco

Marco Schmidt
2003-08-06 16:36:14 UTC
Permalink
Thümmler:

[...]
Post by Thümmler
Beispiel: Ich muß 4 Bytes schicken, in denen jeweils Hexadezimal "00"
'00000000'x)
Also mußt Du doch nicht Hexadezimalzahlen schicken sondern einfach
Integerwerte in binärer Form.
Post by Thümmler
So, nun weiß ich zwar, dass man mit Integer.toHexString(60) die
Hex-Zahl von 60 als String bekommt, jedoch ist das ja nicht in einem
Byte.
Wie kann ich das in Java lösen? Braucht man da Bitmanipulation?
Letzten Endes kann man nur einzelne Bytes versenden und empfangen. Um
ein 32-Bit-Integer (int) in Bytes zu zerlegen bedient man sich meist
den Operationen Shift left/right und bitweises And/Or.

Implementiert ist das bereits in DataIn/OutputStream, für int etwa
readInt / writeInt. Im einfachsten Fall reicht es, den um Deinen
Socketstream zu wickeln. Aber informiere Dich, welche Reihenfolge
nötig ist, falls Du nicht ohnehin selbst die gegenüberliegende Seite
schreibst. DataIn/OutputStream nutzen Big Endian.

Schau Dir mal die API-Docs dieser Klassen an.

Gruß,
Marco
--
Bitte nur in der Newsgroup antworten, nicht per Email!
de.comp.lang.java Homepage: http://www.dclj.de/
FAQ: http://www.faqs.org/faqs/de/comp-lang-java/faq/
Meine Java-Seiten: http://www.geocities.com/marcoschmidt.geo/java.html
Loading...