Seite 1 von 1

problem mit senden von hex values..

Verfasst: Montag 7. November 2005, 22:59
von gNome
hi!
hab n kleines problem und hoffe ihr könnt mir draufhelfen

also ich hab length als integer vorliegen und wandel mir den in hex um:

length = 15
a = hex(length)

a wird somit zu 0xf.

so jetz will ich 0xf an ein socket schicken

sock.send(a)

aber da schickt er mir dann 0xf als string! wie bekomm ich das hin dass er mir wirklich nur den hex-value schickt? also 1 byte mit wert 15 und nicht die anderen 3 ;D

danke schonmal ;)

Re: problem mit senden von hex values..

Verfasst: Dienstag 8. November 2005, 00:44
von BlackJack
gNome hat geschrieben: also ich hab length als integer vorliegen und wandel mir den in hex um:

length = 15
a = hex(length)

a wird somit zu 0xf.

so jetz will ich 0xf an ein socket schicken

sock.send(a)

aber da schickt er mir dann 0xf als string! wie bekomm ich das hin dass er mir wirklich nur den hex-value schickt? also 1 byte mit wert 15 und nicht die anderen 3 ;D
Du kannst keine "Hex values" verschicken. Was Du verschicken kannst sind Bytes. Und Du möchtest gerne ein Byte mit dem Wert 15 verschicken. Das man 15 auch in hexadezimaler Schreibweise als 0xF ausdrücken kann hat damit nichts zu tun.

Wie Du schon gesehen hast erhältst Du mit `hex()` eine Zeichenkette die den Wert hexadezimal darstellt. Also nicht das was Du brauchst.

Du brauchst ein Zeichen, denn Zeichen sind nichts anderes als Bytes, mit dem Wert 15:

Code: Alles auswählen

In [1]: length = 15

In [2]: hex(length)
Out[2]: '0xf'

In [3]: chr(length)
Out[3]: '\x0f'

In [4]: len(chr(length))
Out[4]: 1
Die letzte Eingabe habe ich nochmal gemacht, damit Du siehst, das da wirklich nur ein Zeichen herauskommt. Da ein ASCII-Wert 15 aber nichts "druckbares" ist, wird das Byte mit dem Backslash und in Hex-Notation angezeigt.

Verfasst: Dienstag 8. November 2005, 17:44
von Gast
war mir alles klar ^^ hab mich nur bissl unglücklich ausgedrückt =)
chr(length) das hab ich gesucht. werd das sobald ich daheim bin ausprobieren

danke dir!

Verfasst: Mittwoch 9. November 2005, 11:27
von Gast
hmm da is doch noch ne frage.
was mache ich wenn length 255 überschreitet? das funzt nämlich nicht mit char...

Verfasst: Mittwoch 9. November 2005, 11:41
von jihi
In einem Byte können auch maximal nur Werte bis 255=2^8 gespeichert werden. Wenn du größere Werte übertragen möchtest, musst du das ganze über 2 Bytes => 2^16 = 65536, oder 4 Bytes => 2^32 > 4 Milliarden tun.

Und wie du das machst wird dir der nächste Poster erklähren :lol:
(weil ich weiss es nicht :oops: )

Verfasst: Mittwoch 9. November 2005, 22:27
von BlackJack
Dazu sollte man dann einen Blick in die Doku zum `struct` Modul werfen.

Und man muss sich natürlich vorher schon mal überlegen wie gross die Zahlen werden können damit man weiss wieviele Bytes pro Zahl man senden bzw. empfangen muss.

Verfasst: Mittwoch 9. November 2005, 23:45
von Gast
uh weiss net genau was ich mit dem tipp bzgl structs anfangen soll. hab mir das mal durch gelsesen aber hmmm... ^^

die zu sendenden strings sind bis etwa 8000 byte groß. ne kleine hilfe wär echt noch nett =)

danke ;)

Verfasst: Donnerstag 10. November 2005, 23:46
von BlackJack
Anonymous hat geschrieben:uh weiss net genau was ich mit dem tipp bzgl structs anfangen soll. hab mir das mal durch gelsesen aber hmmm...
Mit dem `struct` Modul kannst Du Zahlen die grösser als 255 sind, in Zeichen- also Byteketten umwandeln die sich dann versenden lassen. Dazu musst Du angeben als welcher C Datentyp die Zahl(en) kodiert werden sollen. Beispiel: Eine 1000 kann man als vorzeichenlosen `int` so umwandeln:

Code: Alles auswählen

In [6]: struct.pack('<I', 1000)
Out[6]: '\xe8\x03\x00\x00'

In [7]: struct.unpack('<I', '\xe8\x03\x00\x00')
Out[7]: (1000L,)
Beim `unpack()` musst Du dran denken das ein Tupel zurückgegeben wird, auch wenn nur ein einziger Wert umgewandelt wird.
die zu sendenden strings sind bis etwa 8000 byte groß. ne kleine hilfe wär echt noch nett =)
Sind das alles Zahlen der gleichen Grössenordnung, also zum Beispiel 2000 Zahlen die in jeweils 32 Bits Platz haben? Dann ist das `array` Modul eventuell eine bessere Alternative. Allerdings hat man da keine Kontrolle darüber ob die Zahlen Big-Endian oder Little-Endian kodiert werden. Die beiden Enden der Socket-Kommunikation müssen also das selbe System verwenden.

Verfasst: Samstag 12. November 2005, 09:13
von Gast
yeah funzt super mit pack! danke dir =)