| |
VB.NET - FortgeschritteneUmwandeln von Hexwert in String | | | Autor: effeff | Datum: 11.04.14 15:59 |
| Moin,
ich wandle einen Hexwert aus der Registry in einen String um... Zumindestens versuche ich das - und weiß nicht, warum ich scheitere...
Also: Der Hexwert "43003a005c00550073006500720073005c007
30079007300610064006d0069006e002e006c00650065007200300031005c0
041007000700044006100740061005c0052006f0061006d0069006e0067005c004
400650073006b0074006f0070005c00530079007300460069006c00650073000000"
soll eigentlich einen String "C:\users..." (Einen Verzeichnispfad) ergeben. Ich kann machen, was ich will, ich bekomme immer nur "C" heraus:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
Dim hex As String = "43003a005c00550073006500720073005c00730079007300610
064006d0069006e002e006c00650065007200300031005c0041
007000700044006100740061005c0052006f0061006d0069006e00
67005c004400650073006b0074006f0070005c00530079007300460069006c00650073000000"
MessageBox.Show(HexToStr(hex))
End Sub
Public Function HexToStr(ByVal Data As String) As String
Dim com As String
Dim i As Integer
For i = 0 To Data.Length - 1 Step 2
com &= ChrW(CInt("&H" & Data.Substring(i, 2)))
Next
Return com
End Function Das irre: Lasse ich mir mit einer kleinen Änderung die einzelnen Buchstaben anzeigen, bekomme ich vernünftige Werte:
For i = 0 To Data.Length - 1 Step 2
Messagebox.Show(ChrW(CInt("&H" & Data.Substring(i, 2))))
Next Woraus erklärt sich denn, dass die Variable "com" nicht um jeweils den nächsten Buchstaben erweitert wird?
Auch irre: Wenn ich den Inhalt einer Textbox jeweils um den Buchstaben erweitern lasse, funktioniert das auch...
For i = 0 To Data.Length - 1 Step 2
Textbox1.text=Textbox1.Text & ChrW(CInt("&H" & Data.Substring(i, _
2))))
Next EALA FREYA FRESENA
Beitrag wurde zuletzt am 11.04.14 um 16:04:43 editiert. | |
Re: Umwandeln von Hexwert in String | | | Autor: Manfred X | Datum: 11.04.14 16:59 |
| Hallo!
Du initialisierst "Com" nicht als Leerstring.
Das Schleifenende paßt nicht.
Ich schlage Stringbuilder vor.
Dim hex As String = _
"43003a005c00550073006500720073005c00730079007300610064006d0069006e002" & _
"006c00650065007200300031005c0041007000700044006100740061005c0052006f0" & _
"61006d0069006e0067005c004400650073006b0074006f0070005c005300790073004" & _
"0069006c00650073000000"
Dim com As String = ""
Dim i As Integer
Dim stb As New System.Text.StringBuilder(hex.length)
For i = 0 To hex.Length - 3 Step 2
stb.Append(ChrW(CInt("&H" & hex.Substring(i, 2))))
Next i
com = stb.ToString
Beitrag wurde zuletzt am 11.04.14 um 17:04:00 editiert. | |
Re: Umwandeln von Hexwert in String | | | Autor: GPM | Datum: 11.04.14 17:08 |
| Public Class Form1
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles _
Me.Load
Dim hex As String = _
"43003a005c00550073006500720073005c00730079007300610064006" & _
"00" & _
"69006e002e006c00650065007200300031005c0041007000700044006" & _
"00" & _
"740061005c0052006f0061006d0069006e0067005c004400650073006" & _
"00" & _
"74006f0070005c00530079007300460069006c00650073000000"
MessageBox.Show(HexToStr(hex))
End Sub
Public Function HexToStr(ByVal Data As String) As String
Dim com As String = ""
For i As Int32 = 0 To Data.Length - 3 Step 4
com &= ChrW(CInt("&H" & Data.Substring(i, 2)))
Next
Return com
End Function
End Class MfG GPM 0 | |
Re: Umwandeln von Hexwert in String | | | Autor: FZelle (Moderator) | Datum: 11.04.14 23:52 |
| Naja, wenn du mal genau hinschaust, siehst du das jeder 2. Wert 00 ist, also ist das Unicode.
Du nimmst aber immer 2 Zeichen, und hast dann immer eine Nullterminierung. | |
Re: Umwandeln von Hexwert in String | | | Autor: Manfred X | Datum: 12.04.14 15:48 |
| Hallo!
Es stehen zwar an jeder 2. Stelle nicht-darstellbare ASCII-0 im Builder
und im String - spricht also alles für Unicode - aber die Zeichenfolge
ist vorhanden.
Der von Dir verwendete String-Viewer interpretiert offenar die erste 0
(hinter dem Laufwerks-C ) als Ende der Zeichenfolge im Sinne einer
null-terminierten Zeichenfolge (worauf FZelle bereits hingewiesen hat).
MfG
Manfred
| |
Re: Umwandeln von Hexwert in String | | | Autor: effeff | Datum: 12.04.14 18:27 |
| Moin,
so hatte ich das auch verstanden. Aber interessant ist dennoch, dass, wenn ich die Variable füllen will, dann nur das erste Zeichen angezeigt wird, doch wenn ich eine Textbox direkt befülle (Textbox1.Text=Textbox1.Text & ...) erscheint der komplette Text dort. Das fand ich interessant und das war der Ursache meiner Frage. Unicode ist übrigens tatsächlich schuld, denn eine andere Hex-Zeichenfolge kann problemlos umgewandelt werden. Die Textbox interessiert also die Null terminierte Zeichenfolge überhaupt nicht, während die Variable abriegelt.
EALA FREYA FRESENA | |
Re: Umwandeln von Hexwert in String | | | Autor: Manfred X | Datum: 12.04.14 18:56 |
| Der String enthält die "nicht-darstellbaren" Null-ASCIIs.
Was daraus im weiteren wird (Display usw.), entscheidet die Software,
die diesen String verarbeitet.
Im Prinzip könnte 0 auch als NUL (oder als eine Ersatzdarstellung), als
Leerzeichen oder nicht angezeigt werden. Und ebenso ist der Abbruch einer
Lese-Operation beim Auftreten von 0 möglich.
Entsprechendes gilt für alle ASCII-Sonderzeichen. Obwohl sie jeweils
eine "definierte Bedeutung" als Steuerzeichen haben, kann man nicht
vorhersehen, wie ihre Verarbeitung in einem Programm tatsächlich erfolgt,
man muß es ausprobieren.
| |
Re: Umwandeln von Hexwert in String | | | Autor: FZelle (Moderator) | Datum: 13.04.14 11:59 |
| http://en.wikipedia.org/wiki/Null-terminated_string | |
Re: Umwandeln von Hexwert in String | | | Autor: eierlein | Datum: 13.04.14 15:04 |
| Versuch's mal so:
Public Function HexToStr(ByVal Data As String) As String
Dim com As String
Dim i As Integer
For i = 0 To Data.Length - 1 Step 4
com &= ChrW(CInt("&H" & Data.Substring(i + 2, 2) & Data.Substring( _
i, 2)))
Next
Return com
End Function 0 | |
Re: Umwandeln von Hexwert in String | | | Autor: us4711 | Datum: 13.04.14 23:09 |
| Meine Lösung:
Function StringFromHexText(ByVal HexText As String) As String
Dim Bytes As New List(Of Byte)
For Index As Integer = 0 To HexText.Length - 1 Step 2
Bytes.Add(Convert.ToByte(HexText.Substring(Index, 2), 16))
Next
Return System.Text.Encoding.Unicode.GetString(Bytes.ToArray)
End Function | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere Infos
|