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
problem mit senden von hex values..
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.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
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
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!
chr(length) das hab ich gesucht. werd das sobald ich daheim bin ausprobieren
danke dir!
hmm da is doch noch ne frage.
was mache ich wenn length 255 überschreitet? das funzt nämlich nicht mit char...
was mache ich wenn length 255 überschreitet? das funzt nämlich nicht mit char...
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
(weil ich weiss es nicht )
Und wie du das machst wird dir der nächste Poster erklähren
(weil ich weiss es nicht )
Gruss Jihi
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.
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.
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
die zu sendenden strings sind bis etwa 8000 byte groß. ne kleine hilfe wär echt noch nett =)
danke
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:Anonymous hat geschrieben:uh weiss net genau was ich mit dem tipp bzgl structs anfangen soll. hab mir das mal durch gelsesen aber hmmm...
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,)
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.die zu sendenden strings sind bis etwa 8000 byte groß. ne kleine hilfe wär echt noch nett =)