vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Bytes 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)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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)?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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]
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bytes bei Übereinstimmung mit Wert aus Tabelle ändern 
Autor: ModeratorDaveS (Moderator)
Datum: 22.11.14 14:48

Wesentlich schneller wäre es die Werte einfach in einem Array zu haben, z.B. so
        Dim tt(255) As Byte
        For i As Integer = 0 To 255
            tt(i) = i
        Next
        tt(31) = 44
        tt(56) = 68
 
        Dim wert As Byte
        Dim neuwert As Byte
 
        wert = 56
        neuwert = tt(wert) ' neuwert = 68
 
        wert = 123
        neuwert = tt(wert) ' neuwert = 123

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ergänzender Hinweis 
Autor: ModeratorDaveS (Moderator)
Datum: 22.11.14 18:43

Oder kurz gesagt, tt(i) = CByte(i) wäre notwendig mit Option Strict On. (tt steht übrigens für "Translation Table").

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 ?

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ergänzender Hinweis 
Autor: ModeratorDaveS (Moderator)
Datum: 26.11.14 19:54

Du kannst auch 2 Byte Werte in der Tabelle haben, und Anfang + Eingabebytewert * 2 berechnen. Soll das ein eigener Zeichensatz sein? Wozu? Zeichensätze gibt es schon mehr als genug.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Was soll eigentlich gewandelt werden? 
Autor: ModeratorDaveS (Moderator)
Datum: 26.11.14 21:23

ChrW(b + &HE000)

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 !
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel