Forum: PC-Programmierung VBnet/VS2020 - Konvertierungsproblem / Format Exception String -> Integer/Byte


von gelatelli (Gast)


Lesenswert?

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

von Schlaumaier (Gast)


Lesenswert?


von Schlaumaier (Gast)


Lesenswert?

Nachtrag:

Schreib aber bei dir das ganze in eine Try / Error Fehlerabfangfunktion. 
Sonst kackt das Teil bei Fehlerhaften Texten ab.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

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.

von Schlaumaier (Gast)


Lesenswert?

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.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

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.

von Schlaumaier (Gast)


Lesenswert?

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.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

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.

von Schlaumaier (Gast)


Lesenswert?

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.

von gelatelli (Gast)


Lesenswert?

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.

von Schlaumaier (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

gelatelli schrieb:

>
1
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
5
  else
6
    'zu doof, eine zweistellige Hexzahl einzutippen
7
  end if
8
End Sub

von gelatelli (Gast)


Lesenswert?

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
9
            BYTESUB1 = MyByte1 'konvertiert substring1 -> Bytes -> Bytesub1
10
        Else
11
            MsgBox("Error Substring1")
12
13
        End If
14
15
        Dim MyByte8 As Byte
16
        If Byte.TryParse(substring2, System.Globalization.NumberStyles.AllowHexSpecifier, Nothing, MyByte8) Then
17
            BYTESUB2 = MyByte8 'konvertiert substring2 -> Bytes -> Bytesub2
18
        Else
19
            MsgBox("Error Substring2")
20
21
        End If


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!

von awb (Gast)


Lesenswert?

Dein Fehler ist in dieser Zeile:
1
substring2 = ganzerstring.Substring(ganzerstring.Length - 3)
Du liest die letzten 3 Zeichen => "-A4" und willst eigentlich nur "A4".

Vielleicht solltest mal du den Debugger und Breakpoints ausprobieren.

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.