Forum: PC-Programmierung Hex, BIG-ENDIAN, LITTLE-ENDIAN


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Edgar (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich möchte mich via TCP zu einer Maschine verbinden und einen Auftrag 
auslösen. Die Verbindung via TCP hat bereits funktioniert, die Maschine 
zeigt eine aktive Verbindung zu meinem Rechner/der Software. Nun muss 
ich ein entsprechendes Telegramm an die Maschine schicken um den Auftrag 
zu starten. Im Handbuch der Maschine ist der Inhalt des Telegramms 
angegeben (siehe gelbe Markierung). Offensichtlich handelt es sich um 
Hex Werte. Nun stehe ich allerdings etwas auf dem Schlauch was die 
Programmierung angeht. Ich nutze Basic und habe die üblichen Befehle zur 
Verfügung wie z.B.

WriteByte
WriteFloat
WriteInt
WriteLine
WriteShort

Ich habe folgendes versucht: WriteLine tcp_stream, "‘q’, $19, $00, 
$0064, $07D0, $2710"
Allerdings kommt mit dem Versand der Zeichenkette nicht die richtige 
Message bei der Maschine an.

von Oliver S. (oliverso)


Lesenswert?

Edgar schrieb:
> Ich nutze Basic

Das wird die Menge der Antworten hier schon mal einschränken.

Ich habe ja auch keine Ahnung, aber zwei Fragen: Was kannst du per 
WriteLine  für Daten schicken? Bytes, Words, ... ?

Die Beschreibung im Anhang hat im Telegramm auch einen Parameter für die 
Länge, der fehlt in deinem Code. Warum?

Oliver

: Bearbeitet durch User
von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Wie immer bei so was: Wireshark installieren 
https://www.wireshark.org/download.html und nachsehen was wirklich hin 
und her geht, wenn überhaupt was hin und her geht.

von Thomas Z. (usbman)


Lesenswert?

nun es gibt die hton Funktionen die Bytefolgen entsprechend der 
networkorder umdrehen.
z.B  msbLong= htonl(LongValue);
jetzt must du nur noch rausfinden wie du das in Basic einbauen kannst

von Dirk B. (dirkb2)


Lesenswert?

Welches Basic denn?
Auf welchem System?
Kann man beim Öffnen des Socket noch Parameter angeben?


Thomas Z. schrieb:
> nun es gibt die hton Funktionen

Das hton steht für "Host TO Network" byteorder (für die Suche in der 
Doku)

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

Edgar schrieb:
> WriteLine tcp_stream, "‘q’, $19, $00, $0064, $07D0, $2710"

Ich bezweifele, dass WriteLine einen String parst.

von c-hater (Gast)


Lesenswert?

Edgar schrieb:

> Ich habe folgendes versucht: WriteLine tcp_stream, "‘q’, $19, $00,
> $0064, $07D0, $2710"
> Allerdings kommt mit dem Versand der Zeichenkette nicht die richtige
> Message bei der Maschine an.

Was nicht sehr überraschend ist, da die Maschine ganz sicher keinen 
String haben will. Was sie haben will, steht in dem Schnipsel Doku, den 
du gepostet hast.

Wie du dein Basic dazu überredest, das Gewünschte zu senden, musst du 
schon allein herausfinden, da du uns nicht einmal verraten hast, um 
welches Basic es sich handelt. Kleiner Tip: Es gibt ganz viel mehr als 
nur eins und die unterscheiden sich voneinander oft ganz erheblich.

von Edgar (Gast)


Lesenswert?

c-hater schrieb:
> Was nicht sehr überraschend ist, da die Maschine ganz sicher keinen
> String haben will. Was sie haben will, steht in dem Schnipsel Doku, den
> du gepostet hast.
>
> Wie du dein Basic dazu überredest, das Gewünschte zu senden, musst du
> schon allein herausfinden, da du uns nicht einmal verraten hast, um
> welches Basic es sich handelt. Kleiner Tip: Es gibt ganz viel mehr als
> nur eins und die unterscheiden sich voneinander oft ganz erheblich.

also ich nutze BlitzPlus dafür, das wird den meisten warscheinlich nicht 
bekannt sein. Ist schon veraltet aber erfüllt seinen zweck und ist halt 
aus alter Gewohnheit am schnellsten für mich.

Stimmt natürlich, die Maschine erwaret keinen String, daher war mein 
Lösungsansatz falsch.

Ich bin nun dazu übergegangen die Hex-Werte in Deizimal umzurchen und 
dann byte weise zu verschicken:

bank=CreateBank (14)

PokeInt bank,1, 34765
PokeInt bank,2, 8
PokeInt bank,3, 12
PokeInt bank,4, 1
PokeInt bank,5, 113
PokeInt bank,6, 8
PokeInt bank,7, 21
PokeInt bank,8, 100
PokeInt bank,9, 2000
PokeInt bank,10, 10000

WriteBytes bank, tcp, 0, 14

Funktioniert leider auch nicht.

von c-hater (Gast)


Lesenswert?

Edgar schrieb:

> also ich nutze BlitzPlus dafür, das wird den meisten warscheinlich nicht
> bekannt sein.

So ist es wohl. Ich glaube mich erinnern zu können, zumindest den Namen 
schonmal gehört oder gelesen zu haben, das ist aber auch schon alles.

> Ist schon veraltet aber erfüllt seinen zweck

Nun, offensichtlich ja wohl doch nicht: Du bekommst dein Problem damit 
nicht gelöst...

> bank=CreateBank (14)
>
> PokeInt bank,1, 34765
> PokeInt bank,2, 8
> PokeInt bank,3, 12
> PokeInt bank,4, 1
> PokeInt bank,5, 113
> PokeInt bank,6, 8
> PokeInt bank,7, 21
> PokeInt bank,8, 100
> PokeInt bank,9, 2000
> PokeInt bank,10, 10000
>
> WriteBytes bank, tcp, 0, 14

Ohne jetzt die Doku zu diesem exotischen Basic-Dialekt gelesen zu haben, 
würde ich vermuten, dass dies ungefähr in die richtige Richtung geht, 
aber im Detail noch falsch ist. Insbesondere würde ich mal überprüfen, 
ob es ausser PokeInt noch irgendwelche anderen Poke*-Instruktionen gibt, 
insbesondere vielleicht PokeByte. Damit könnte das dann langsam was 
werden...

von Dirk B. (dirkb2)


Lesenswert?

Edgar schrieb:
> bank=CreateBank (14)
>
> PokeInt bank,1, 34765
> PokeInt bank,2, 8
> PokeInt bank,3, 12
> PokeInt bank,4, 1
> PokeInt bank,5, 113
> PokeInt bank,6, 8
> PokeInt bank,7, 21
> PokeInt bank,8, 100
> PokeInt bank,9, 2000
> PokeInt bank,10, 10000
>
> WriteBytes bank, tcp, 0, 14

Jetzt gibt es auch die Funktion WriteBytes. Ok.

Bytes und Werte über 255 sind etwas merkwürdig.
(Edit: hab gesehen, dass es PokeInt ist - ist aber auch verkehrt, vor 
allem die Position wird in Bytes angegeben)

(du brauchst wohl undigned 16-Bit Werte. Oft WORD genannt)

Versteht das Basic auch Hexzahlen?
Ein 80x86 und Nachfolger arbeiten mit Little Endian.
Du musst also die Bytes vertauschen. Aber das steht in deinem Bild.

Edit:

: Bearbeitet durch User
von Ingo D. (ingo2011)


Lesenswert?

Hi ,

also ich kann mir nicht vorstellen,
das die Tüddels da um den Char richtig sind

"->‘q’<-, $19, $00, $0064, $07D0, $2710"

Mit Basic habe ich vor 30 Jahre das letzt Mal was gemacht und
BlitzBasic , nee keine Ahnung ...
In Python könnte das man heute eher so machen...

msg = b'\x71\x19\x00\x0064\x07d0\x2710'

Gruß Ingo

von Dirk B. (dirkb2)


Lesenswert?

Ingo D. schrieb:
> In Python könnte das man heute eher so machen...
>
> msg = b'\x71\x19\x00\x0064\x07d0\x2710'

Auf dem Bild vom Eröffnungsbeitrag kann man sehen, dass auch das 'q' 16 
Bit hat und bei den 16-Bit Werten die Bytes vertauscht werden (auf 
Big-Endian)

von Georg (Gast)


Lesenswert?

Dirk B. schrieb:
> bei den 16-Bit Werten die Bytes vertauscht werden (auf
> Big-Endian)

Wenn das so ist schreibt man halt statt x0064 x6400.

Georg

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Ach ja, gäbe es doch nur eine Möglichkeit zu sehen was wirklich über das 
Netzwerk rein und raus geht. So ein Hexenwerk müsste man glatt erfinden 
[/Ironie]

von Dirk B. (dirkb2)


Lesenswert?

Hannes J. schrieb:
> So ein Hexenwerk müsste man glatt erfinden

Aber dann braucht man auch einen Zauberer, der das hexen beherscht.

Aber der muss für diese Anwendung gar nicht zaubern - das kann der so.

von Ingo D. (ingo2011)


Lesenswert?

Hi,

ich sehe das Problem nach wie vor so, das niemand weiß wie man diesen
Byte-Stream, ob nun big oder  little Endian, in dem omninösen 
Basic-Dialect versendet. Dem TO scheint es auch mittlerweile egal zu 
sein, der meldet sich nicht ,mehr .....

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

Ingo D. schrieb:
> das niemand weiß wie man diesen
> Byte-Stream, ob nun big oder  little Endian, in dem omninösen
> Basic-Dialect versendet.


Edgar schrieb:
> bank=CreateBank (14)
>
> PokeInt bank,1, 34765
> WriteBytes bank, tcp, 0, 14

Zuerst sollte das Array groß genug sein: 20 Bytes (Kann man im Bild 
nachzählen)
Dann sollten man auch Bytes in das Array schreiben und auch an Position 
0 beginnen
1
rem 20 Bytes reservieren
2
bank=CreateBank (20)
3
rem $87
4
PokeByte bank,0, 135 
5
rem $CD
6
PokeByte bank,1, 205 
7
..
8
9
WriteBytes bank, tcp, 0, 20

von Genau (Gast)


Lesenswert?

Die Dokumentation da auf dem Bild ist einfach schlecht und es fehlen ein 
paar Wörter die alles erklären könnten. Das sind eher Notizen für Leute 
die das schon gemacht haben oder geschult sind.

von Oliver S. (oliverso)


Lesenswert?

Genau schrieb:
> Die Dokumentation da auf dem Bild ist einfach schlecht und es fehlen ein
> paar Wörter die alles erklären könnten.

Die Dokumentation ist absolut beispielhaft. Kurz, knapp, mit allem, was 
man wissen muß, und genau auf den Punkt.

Genau schrieb:
> Das sind eher Notizen für Leute
> die das schon gemacht haben oder geschult sind.

Das allerdings könnte so beabsichtigt sein.

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.