| |
VB.NET - Ein- und UmsteigerBytes bei Übereinstimmung mit Wert aus Tabelle ändern | | | Autor: lastyle | Datum: 21.11.14 21:48 |
| Nächstes Probem erkannt,
ich brauche eine Tabelle in der ich nach einem Byte suchen kann und bei übereinstimmung das Byte mit geändertem Wert zurückgebe.
Beispieltabelle wäre dann
31 , 44
56 , 68
soll heissen , ich suche in der Tabelle nach 31 , wie hier ersatzwert ist 44 . Funktion gibt mir dann 44 zurück. bei 56 dann 68
Kann ich die folgende Funktion von Char auf Byte dazu einfach so umbauen ?
' Neue Vergleichstabelle anlegen
Dim bsTabelle As New SortedDictionary(Of Char, Char)
' Vergleichstabelle füllen
bsTabelle.Add("A"c, "4"c)
bsTabelle.Add("B"c, "8"c)
bsTabelle.Add("C"c, "("c)
| |
Re: Bytes bei Übereinstimmung mit Wert aus Tabelle ändern | | | Autor: Manfred X | Datum: 21.11.14 22:18 |
| Warum verwendest Du nicht eine SortedDictionary(Of Byte, Byte)? | |
Re: Bytes bei Übereinstimmung mit Wert aus Tabelle ändern | | | Autor: lastyle | Datum: 21.11.14 22:39 |
| Cool, kannte ich bisher noch nicht. Sieht gut aus. Gekauft !
Danke
| |
Re: Bytes bei Übereinstimmung mit Wert aus Tabelle ändern | | | Autor: Manfred X | Datum: 21.11.14 22:47 |
| Du kannst jedes Objekt als Schlüssel (TKey) oder Wert (TValue)
einer SortedDictionary verwenden, mit folgender Einschränkung/Bedingung:
[I] Das SortedDictionary<TKey, TValue> benötigt für den Vergleich von Schlüsseln
eine Vergleichsimplementierung. Sie können mithilfe eines Konstruktors, der einen
comparer-Parameter akzeptiert, eine Implementierung der generischen IComparer<T>-
Schnittstelle angeben. Andernfalls wird der generische Standardvergleich
Comparer<T>.Default verwendet. Wenn der Typ "TKey" die generische
System.IComparable<T>-Schnittstelle implementiert, verwendet der Standardvergleich
diese Implementierung.[/I]
| |
Re: Bytes bei Übereinstimmung mit Wert aus Tabelle ändern | | | Autor: lastyle | Datum: 22.11.14 12:16 |
| Ah ja ,
hört sich erstmal kompliziert an, aber ich gehe mal davon aus das es nicht so kompliziert sein wird da ich im jetzigen fall nur von $00 bis $ff ändern muss. Also single Byte und das sollte nicht wirklich schwer sein damit
| |
Re: Bytes bei Übereinstimmung mit Wert aus Tabelle ändern | | | Autor: Manfred X | Datum: 22.11.14 12:23 |
| Die sog. "Primitives" (= Datentypen wie Byte, Integer, Double u.ä.)
aber z.B. auch String implementieren jeweils einen Standardvergleich,
d.h. Du mußt Dich um den "Comparer" in einer "Dictionary" oder "List" nicht
kümmern - es sei denn, Du benötigst eine spezielle Vergleichsoperation.
(Der Comparer bezieht sich bei der SortedDicionary-Klasse nur auf den
Vergleich / die Anordnung der Keys, aber nicht auf die Beziehung zwischen
Keys und Values.)
Beitrag wurde zuletzt am 22.11.14 um 12:25:16 editiert. | |
Ergänzender Hinweis | | | Autor: Manfred X | Datum: 22.11.14 15:39 |
| Array-Indices werden stets als Datentyp "Integer" erwartet.
Allerdings stellt die Umwandlung von Byte in Integer eine
- auch strikt zulässige - implizite Erweiterungskonvertierung dar.
Dim byteconvert(255) As Byte
For i As Integer = 0 To 255
'i kann hier nicht Byte sein,
'weil i am Ende der Schleife auf 256 steht = unzulässig als Byte
byteconvert(i) = CByte(i) 'explizite Umwandlung Integer -> Byte
Next i
'Explizite Festlegung des zugewiesenen Datentyps
'(bei hart codierten Zahlen optional !!)
byteconvert(31) = CByte(44)
byteconvert(56) = CByte(68)
Dim oldbyte As Byte '= irgendwas 0-255
Dim neuwert As Byte
'Explizite Erweiterungskonvertierung des Index
neuwert = byteconvert(CInt(oldbyte))
'Implizite Erweiterungskonvertierung des Index: Byte -> Integer
neuwert = byteconvert(oldbyte) | |
Re: Ergänzender Hinweis | | | Autor: lastyle | Datum: 25.11.14 22:38 |
| Da ich mich bisher noch nicht mit Unicode auseinandersetzen musste habe ich dann leider falsche bzw unvollständige angaben gemacht.
Der Ursprungswert ist ein Byte (00-ff) und muss nach unicode (&Hxxxx) gewandelt werden.
Das wandeln ist das eine. Aber wie schreibe ich dann nachher noch den gewandelten wert als zeichen eines Unicode Zeichensatzes in ein Listbox Item als String ?
| |
Bytewert in Zeichen wandeln | | | Autor: Manfred X | Datum: 25.11.14 22:45 |
| Probiere die ChrW-Funktion oder ein Codiersystem aus System.Text.Encoding
für die Umwandlung eines Bytewertes in ein Zeichen.
| |
Re: Bytewert in Zeichen wandeln | | | Autor: lastyle | Datum: 26.11.14 13:08 |
| Hab ich mir mal angesehn aber ich bekomme es nicht auf die reihe. Mein Aufruf ist
MsgBox(ByteArrayToTextString(getunicode(33)))
Die Funktionen Dazu :
Public Function ByteArrayToTextString(ByRef Barr() As Short) As String
Dim enc As System.Text.Encoding = System.Text.Encoding.Unicode
Return enc.GetString(Barr)
End Function
Private Function getunicode(ByVal input As Byte)
Dim tt(255) As Short
For i As Byte = 0 To 254
tt(i) = i
Next
tt(33) = &H44
tt(60) = &H2501
tt(61) = &H2660
Return tt
End Function
Und Byte kann ich ja nicht nutzen, daher Short als 16 Bit signed. Wobei ich schon glaube das da der Hund begraben liegt.
| |
Re: Bytewert in Zeichen wandeln | | | Autor: Manfred X | Datum: 26.11.14 13:22 |
| Vielleicht so ....
Dim tt(10) As Byte
tt(0) = CByte(&H44)
Dim enc As System.Text.Encoding = System.Text.Encoding.UTF8
Dim c() As Char = enc.GetChars(tt, 0, 1) Wnn Du Byte als Typ der Laufvariable verwendest,
mußt Du den Index 255 noch explizit zuweisen.
Beitrag wurde zuletzt am 26.11.14 um 13:28:05 editiert. | |
Was soll eigentlich gewandelt werden? | | | Autor: Manfred X | Datum: 26.11.14 13:54 |
| Willst Du bestimmte Byte-Werte ersetzen oder
willst Du Zeichen in einer Zeichenfolge austauschen?
Ich vermute, Du benötigst eher so etwas
Dim charreplacer As New Dictionary(Of Char, Char)
charreplacer.Add(ChrW(&H44), ChrW(33))
charreplacer.Add(ChrW(&H2501), ChrW(60))
charreplacer.Add(ChrW(&H2660), ChrW(61))
Dim text As String = "irgendein text"
For Each kvp As KeyValuePair(Of Char, Char) In charreplacer
text = text.Replace(kvp.Key, kvp.Value)
Next kvp
Beitrag wurde zuletzt am 26.11.14 um 14:18:40 editiert. | |
Re: Was soll eigentlich gewandelt werden? | | | Autor: lastyle | Datum: 26.11.14 18:11 |
| Jein,
ich habe eine Datei in der Charcodes von $00 bis $ff stehen. Jedes Byte steht für ein bestimmtes Zeichen. Der Zeichensatz mit dem das angezeigt werden soll ist ein Unicode TrueTypeFont. Und ich muss dafür eine Mapping Tabelle erstellen.
als Beispiel
Text wäre "Hallo Forum!" , dann steht in der Datei
68 41 4C 4C 4F 20 66 4F 52 50 4D 21
das wäre dann in unicode für diesen Zeichensatz
0268 0041 004C 004C 004F 0020 0266 004F 0052 0050 004D 0621
Im moment lese ich die Datei mit IO.File.ReadAllBytes als Byte aus und möchte dann umgewandelt in Unicode die gewandelte Zeile an eine Listbox als Item senden da.
Beitrag wurde zuletzt am 26.11.14 um 18:17:34 editiert. | |
Re: Was soll eigentlich gewandelt werden? | | | Autor: Manfred X | Datum: 26.11.14 19:02 |
| Vielleicht so ...
Dim byt() As Byte = _
{&H68, &H41, &H4C, &H4C, &H4F, &H20, &H66, &H4F, &H52, &H55, &H4D, &H21}
'hALLO fORUM!
Dim ascii_enc As System.Text.Encoding = System.Text.Encoding.ASCII
Dim test As String = ascii_enc.GetString(byt)
'Unicode setzt für Ascii-Werte ein Byte auf 0
Dim unicode_enc As System.Text.Encoding = System.Text.Encoding.Unicode
Dim byt_unicode() As Byte = unicode_enc.GetBytes(test)
Dim hex_unicode(test.Length - 1) As String
Dim cp As Integer = -1
For i As Integer = 0 To byt_unicode.Length - 1 Step 2
cp += 1
hex_unicode(cp) = Hex(byt_unicode(i)) & Hex(byt_unicode(i + 1))
Next i In diesem Array kannst Du dann die Ersetzungen vornehmen.
Beitrag wurde zuletzt am 26.11.14 um 19:09:39 editiert. | |
Re: Was soll eigentlich gewandelt werden? | | | Autor: lastyle | Datum: 26.11.14 20:16 |
| Wird so leider nicht klappen.
Das erste Byte soll ja nicht $00 sein sonst.
Ich hab mir den Charset noch einmal genauer angeschaut, da ist noch ein Mapping mit drin,
alles was Byte $00-$ff ist , wird noch einmal korrekt im Unicode Format bei $e0xx abgebildet. Heisst also ich muss $40 nach $E040 wandeln und dann als Zeichen in den String bekommen.
| |
Re: Was soll eigentlich gewandelt werden? | | | Autor: lastyle | Datum: 26.11.14 22:36 |
| Versteh ich ja soweit auch mit dem padden, nur ich steh offensichtlich voll auf dem Schlauch,
Ich lese das Array ein mit
Dim bdata As Byte() = IO.File.ReadAllBytes(Application.StartupPath & "\dirfiles\" & "raw" )
aktuell enthält die Datei zu Testzwecken Bytes von $00 bis $ff (Grösse der Datei ergo 256 Bytes)
Ich bekom das nicht auf die Reihe die Deklarationen richtig zu machen. Sobald ich versuche das Array , oder auch nur einen Char zu wandeln compliert nichts mehr, die Umwandlung und / oder die Deklaration ist falsch.
Kann mir bitte nicht einer von euch die Korrekte Function Posten wie ich aus dem bdata Array ein mit $e000 pro Byte gepaddeten String rausbekomme den ich dann an meine Listbox übergeben kann ?
Ich häng da jetzt schon 3 Tage dran und bekomme es einfach nicht in den Schädel was ich falsch mache.
Vielen lieben Dank
| |
Re: Was soll eigentlich gewandelt werden? | | | Autor: Manfred X | Datum: 26.11.14 22:53 |
| Dim bt(255) As Char
For i As Integer = 0 To 255
bt(i) = ChrW(CByte(i) + &HE00)
Next i | |
Re: Was soll eigentlich gewandelt werden? | | | Autor: eierlein | Datum: 27.11.14 00:12 |
|
Teste am Besten mit einer kurzen Datei, die z.B. nur "ABC" (hex 41 42 43) enhält.
Dim NeuString As String = ""
Dim bdata As Byte() = IO.File.ReadAllBytes("...")
For i As Integer = 0 To bdata.Length - 1
Debug.Print((bdata(i) + &H9E00).ToString("X4")) ' Nur zur Info
NeuString &= ChrW(bdata(i) + &H9E00)
Next
Debug.Print(NeuString) 'Zur Info. Nicht deine Schrift!!
'Jetzt deine Schrift zuweisen und Neustring in die Listbox 0 | |
Re: Was soll eigentlich gewandelt werden? | | | Autor: lastyle | Datum: 27.11.14 00:33 |
| DANKE DANKE !!!
Es wandelt so wie es soll. Jetzt muss ich den String noch Splitten da im Dirlisting kein linefeed intregiert ist, aber das ist jetzt ein Kinderspiel.
Nochmal 1000 Dank. ich hab echt schon Kopfschmerzen bekommen.
Wenn wir uns mal Treffen sollten geb ich ein Bier aus , oder auch 2 !
| |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere Infos
|