Guten Abend Community, ich bin Anfänger, habe hier ein kleines
Konvertierungsproblem, und finde die Lösung nicht...
Ich möchte 2 Zeichen im HEX Format von einer Richtextbox in eine
Variable schreiben.
Heißt: Ich schreibe 80 in die Textbox -> Variable = &H80, ich schreibe
FF in die Textbox -> Variable = &HFF etc.
Solange es zwei Zahlen sind, also z.B. die 80 -> &H80, funktioniert
alles.
Aber bei Buchstaben, z.B. "FF" -> gewollt &HFF kommt eine unbehandelte
Ausnahme:
1
System.FormatException: "Die Eingabezeichenfolge hat das falsche Format."
Das ganze sieht so aus:
1
Public Class Form1
2
Public v1 As Integer
3
Public v2 As Byte = Convert.ToByte(v1, 16)
und hier tritt der Fehler auf:
1
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
2
Dim MyInteger As Integer = Convert.ToInt32(RichTextBox1.Text) '<-- hier kommt die Expecption
3
v1 = MyInteger
4
End Sub
im weiteren wird v1 dann in v2 geschrieben...
Wie gesagt funktioniert es mit Zahlen problemlos, aber mit Buchstaben
kommt der Fehler.
Wo liegt das Problem? Wie muss ich korrekt konvertieren?
Danke schonmal
ToInt32() erwartet ja bestimmt auch Zahlen und keine Buchstaben.
Wenn du die Hexzahlen weiterverarbeiten (damit rechnen usw.) möchtest,
mußt du sie erst einmal mit VAL() umrechnen.
Die 80 ergibt ja den Wert 128 und FF ergibt den Wert 255.
Ich bin zwar jetzt kein .Net - Programmierer, aber so macht man das
allgemein in anderen Sprachen. Sicher gibt es die eine oder andere
Sprache oder Scriptsprache, die das automatisch erkennt, bzw.
damit rechnen kann, wenn die Hexzahl mit &H gekennzeichnet ist.
Heinz B. schrieb:> Wenn du die Hexzahlen weiterverarbeiten (damit rechnen usw.) möchtest,> mußt du sie erst einmal mit VAL() umrechnen.
FALSCH.
Val rechnet nix um.
VAL wandelt "55" in 55 um aber "h55" in einen Fehler.
Eingabe$ = "44,11"
Ausgabe = val(replace(Eingabe,",",".")) * 2
Ausgabe = 88.22
Das zur Erklärung. Wenn er die Replace-Funktion NICHT macht ist Ausgabe
= 88.00
VAL beißt alles ab, was keine Zahl ist. Man darf nicht einmal ein
Leerzeichen am Anfang des Strings haben, sonst wird der Wert 0.
Ich hatte natürlich vorausgesetzt, daß er VAL auch richtig benutzen
soll. Da sollte man schon mal in der Hilfe schauen, in welchem
Kontext man so eine Funktion nutzen möchte.
Deshalb ist das, was Schlaumeier hier schreibt, auch nur bedingt
richtig.
Ein VAL("&H55") ist was anderes (das richtige), als ein VAL("55").
Es geht ja hier schließlich um Hexzahlen. Das hätte aber Schlaumeier
direkt erkennen müssen.
Also in etwa so ein Konstrukt :
Convert.ToInt32(Str$(VAL("&H" + RichTextBox1.Text)))
Obwohl das Umwandeln in einen String für ToInt32 wahrscheinlich
nicht nötig ist, wenn man das Ergebnis von VAL() gleich in ein
INT speichert.
Was der TO noch nicht gesagt hat, ob er byteweise oder z.B.
ganze Integerzahlen auslesen möchte. Bei Zahlensystemen wie
INT, das bei 32Bit Systemen 4Byte lang ist, macht ein byteweises
Auslesen und direktes Konvertieren keinen Sinn. Bei Buchstaben
usw. aber schon.
Heinz B. schrieb:> Es geht ja hier schließlich um Hexzahlen. Das hätte aber Schlaumeier> direkt erkennen müssen.
Geht es aber nicht Ausschließlich.
Ich habe das selbe Problem gerade eben mit einer RFID-Karte. (mifare).
Da wird ein Text auch als Datenblock HEX geschrieben. Und ich wollte den
Text zurück lesen. Ist G.s.D. in B4R einfacher als in VB.
Im Moment können wir ja auch nur rumrätseln. Der TO hat ja den
Kontext nicht genannt, wie die Hexzahlen in die Textbox kommen.
Das kann ja von einem Anwender sein, aber auch genauso von einem
Gerät, sei es eine ser. Schnittstelle oder auch, wie bei dir mit
RFID. Man muß ja auch wissen, wie so eine Byte zu interpretieren
ist, also als einzelnes Zeichen (z.b. Buchstabe oder Ziffer) oder
sonst wie.
Bei Geräten oder auch MC's hat man ja auch oft das Problem, daß das
abschließende Chr$(0), das einen ANSI-String kennzeichnet, fehlt.
Da ist es dann besser, die Bytes einzeln zu lesen oder in einen
Speicherbereich.
Wenn dann noch die Größe bekannt ist, wie z.B. bei deiner RFID
Karte, umso besser.
Heinz B. schrieb:> Wenn dann noch die Größe bekannt ist, wie z.B. bei deiner RFID> Karte, umso besser.
hihi.
Das ist Problem 2 des TO.
Was ist mit Sonderzeichen, Zeichensatz etc. Und die allereinfachste
Frage.
Wie unterscheide ich Text von Zahlen.
Lieber TO, ganz ernsthaft. Das ist ein sehr komplexes Thema. Und ich
habe mir schon an einigen Pharsern den Kopf zerbrochen. So lange die
Werte alle brav + richtig sind ist alles prima. Aber wehe nicht. ;)
Hier ist eine Online-Version die ich die Nacht benutzt habe, weil ich zu
faul war die Daten ich ich aus den RFID-Ding gelesen habe, selbst
nachzurechnen obs die selben waren die ich rein geschrieben habe.
Und ich hab immer noch nicht alle Probleme im Griff. z.b. Gibt es
Unterschiede in den Datenblöcken wenn meine b4x/Github-Libs die Daten
schreibt, oder wenn eine Android-app die ich mir gesaugt habe, die Daten
schreibt.
Aber das ist nur ein Zweitrangig-Problem. Ich muss nur ein Code nach
der Art "LP-000012" lesen. Immerhin soll das nur für einen Digitalen
Schallplattenspieler sein, der eine ECHTE Schallplatte spielen soll ohne
sie aus der Hülle zu nehmen.
Viele Antworten - ich antworte mal allgemein auf alles.
Also:
Ich schreibe die Zahlen / Buchstaben selbst in die Textbox.
Ich will eigentlich nur erreichen dass die Eingabe als HEX an eine
serielle Schnittstelle weitergegeben wird.
Sprich: Wenn ich 80 schreibe und den Textbox- Inhalt direkt in die
Variable, und diese dann an die Schnittstelle sende, wird daraus eine
50. Die Hardware möchte aber eine HEX 80.
Schlaumaier schrieb:> https://www.includehelp.com/code-snippets/convert-hexadecimal-string-to-decimal-integer-in-vb-net.aspx
das, und alles was sonst noch so geschrieben wurde, werde ich heute
Abend testen.
Danke euch.
Genau da liegt dein Problem.
WAS schreibst du wirklich in die Textbox. Schreibst du Menschensprache
z.b.
"gelatelli ist meist lieb"
Dann musst du das nur in HEX umwandeln lassen.
Du kannst auch "67 65 6C 61 74 65 6C 6C 69 20 69 73 74 20 6D 65 69 73 74
20 6C 69 65 62" schreiben und das direkt senden. Dann kommt auf dein
Gerät halt nach einer Rückübersetzung "gelatelli ist meist lieb" raus.
Du hast aber ein Problem. Sobald du im acsii-Satz > 127 bist, wird es
zum Problem. Heißt äöü und so was, werden sehr wahrscheinlich falsch
angezeigt.
Das kann dir auch passieren wenn du die normale Umwandlung von VB nutzt.
Ich würde dann von Hand ran. Einfach eine For-Next-Schleife STEP 2
nutzen. Und die Sonderzeichen "von Hand" tauschen.
Besonders die billigen LCD-Displays haben sehr oft Probleme mit den
Zeichensatz.
Ist einfach alles, kann aber SEHR zickig sein. Ich hab einige Funktionen
geschrieben die so Probleme beseitigen.
Private Sub Button3_Click(sender As Object, e As EventArgs)
2
> Handles Button3.Click
3
> Dim MyInteger As Integer = Convert.ToInt32(RichTextBox1.Text)
4
> '<-- hier kommt die Expecption
5
> v1 = MyInteger
6
> End Sub
Mein Gott. Das hat doch garnix mit dem zu tun, was du willst bzw. was du
als Ausgangsituation beschrieben hattest.
Das war nämlich: du gibst zwei Hexdigits in die Box ein und willst dann
das entsprechende Byte.
und das geht so:
1
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
2
dim MyByte as Byte
3
if Byte.TryParse(RichTextBox1.Text, System.Globalization.NumberStyles.AllowHexSpecifier, Nothing, MyByte) then
4
'MyByte enthält jetzt das Byte zur weiteren Verarbeitung
c-hater schrieb:> und das geht so:
Danke erstmal, nun habe ich mir deinen Code genommen, und bin am
verzweifeln.
Ich habe extra ein neues Projekt erstellt, zwecks Fehlersuche.
Folgender Code
1
Public Class Form1
2
Public ganzerstring As String = "FF-A4"
3
Public substring1 As String 'soll die ersten 2 Zeichen von ganzerstring werden
4
Public substring2 As String 'soll die letzten 2 Zeichen von ganzerstring werden
5
Public BYTESUB1 As Byte 'soll substring1 als byte sein
6
Public BYTESUB2 As Byte 'soll substring1 als byte sein
##Code im Button#
1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
2
substring1 = ganzerstring.Substring(0, 2) 'die ersten beiden Zeichen (FF) von ganzerstring -> substring1
3
substring2 = ganzerstring.Substring(ganzerstring.Length - 3) 'die letzten beiden Zeichen (A4) von ganzerstring -> substring2
4
5
Label19.Text = substring1 & substring2 'testweise
6
7
Dim MyByte1 As Byte
8
If Byte.TryParse(substring1, System.Globalization.NumberStyles.AllowHexSpecifier, Nothing, MyByte1) Then
Ich habe den Code von "c-hater" hier 2x in Verwendung. Einmal um
substring1 (FF) zu Bytes zu konvertieren (-> Bytesub1-Variable) -->
FUNKTIONIERT!
Der GLEICHE Code copy-pasted, und entsprechend abgeändert, soll
substring2 (A4) zu Bytes konvertieren (-> Bytesub2-Variable) -->
ERROR!!!
Es erscheint bei oben genanntem Test-Code immer die MsgBox "Error
Substring2".
Testweise habe ich "ganzerstring" von FF-A4 zu A4-FF geändert, also
genau umgekehrt. Der Fehler kommt TROTZDEM in Substring2.
Am Ende ist es ein ganz simples Problem, aber ich finde es einfach
nicht. Kann den Code mal jemand testen? Mehr als das oben gezeigte ist
im Bsp.Projekt nicht drin. Oder sieht jemand direkt den Fehler?
Der Übersichtlichkeit halber, hier nochmal der ganze Code als Screenshot
https://ibb.co/RPzXX7w
DANKE!