problem mit senden von hex values..

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
gNome

Montag 7. November 2005, 22:59

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 ;)
BlackJack

Dienstag 8. November 2005, 00:44

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.
Gast

Dienstag 8. November 2005, 17:44

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!
Gast

Mittwoch 9. November 2005, 11:27

hmm da is doch noch ne frage.
was mache ich wenn length 255 überschreitet? das funzt nämlich nicht mit char...
jihi
User
Beiträge: 14
Registriert: Montag 29. August 2005, 20:53
Wohnort: Hessen
Kontaktdaten:

Mittwoch 9. November 2005, 11:41

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: )
Gruss Jihi
BlackJack

Mittwoch 9. November 2005, 22:27

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.
Gast

Mittwoch 9. November 2005, 23:45

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 ;)
BlackJack

Donnerstag 10. November 2005, 23:46

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.
Gast

Samstag 12. November 2005, 09:13

yeah funzt super mit pack! danke dir =)
Antworten