Der Wert für ein unsigniertes Byte war zu groß oder zu klein.

  • VB.NET
  • .NET (FX) 4.0

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von chaos_progger.

    Der Wert für ein unsigniertes Byte war zu groß oder zu klein.

    Hi ich hab ein problem wiefolgt:
    Ich habe einen utf8 string("터보 경험치 초콜릿(3H)") und möchte den per Convert.ToByte() convertieren.
    Dies bewerkstellige ich mit einer schleife:

    VB.NET-Quellcode

    1. Dim strbylist as new list(of Byte)
    2. For i = 0 to str.lengh -1
    3. strbylist.add (Convert.ToByte(str.Chars(i)))
    4. Next i


    Nun kommt aber bei mir der fehler "Der Wert für ein unsigniertes Byte war zu groß oder zu klein." bei "strbylist.add (Convert.ToByte(str.Chars(i)))"
    Ich hoffe hier kann man mir weiterhelfen.
    Mfg
    Wer Rechtschreibfehler findet darf sie behalten :)
    Habe gerade genau das selbe Problem mit dem hier und probiere gerade schon alles durch aber komme irgendwie nicht auf die Lösung. ;(

    VB.NET-Quellcode

    1. Dim chars As Char() = ...
    2. Dim bytes(chars.Length - 1) As Byte
    3. For i As Integer = 0 To chars.Length - 1
    4. bytes(i) = Convert.ToByte(chars(i))
    5. Next
    6. Return bytes
    Wenn ich Sie jetzt um Sex bitten würde – wäre Ihre Antwort die gleiche, die Sie auf diese Frage geben? ;)
    @joniator @chaos_progger
    Das geht über Encoding (und jetzt bitte kein "Das ist doch C#"):

    C#-Quellcode

    1. private byte[] StringToByteArray(string str)
    2. {
    3. System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    4. return enc.GetBytes(str);
    5. }
    6. private string ByteArrayToString(byte[] arr)
    7. {
    8. System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    9. return enc.GetString(arr);
    10. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    @RodFromGermany : Wie würdest du einen String, der Unicode-Zeichen enthält, in einen ASCII-Zeichencode umwandeln?

    Nimm statt ASCII Utf8 oder für die interne Repräsentation Unicode:

    VB.NET-Quellcode

    1. byte[] data = System.Text.Encoding.Unicode.GetBytes("bla");


    Zur Info: Chars sind 16-Bit-Werte, Byte und signed Byte besitzen aber nur 8 Bits, weshalb auf jeden Char theoretisch 2 Bytes kommen. Buchstaben selbst werden normalerweise über verschiedene Encodings bereitgestellt, so sind bspw. Unicode, Utf8, Ascii solche Codierungen. Darunter kann man sich quasi Tabellen vorstellen. So besitzt der Buchstabe 'A' einen entsprechenden Eintrag in der Tabelle, aber auch 'a' oder asiatische Zeichen. Letztere werden von Ascii bspw. nicht unterstützt, von Unicode und Utf8 aber schon. Es gibt bei Unicode auch Buchstaben, die laut Codierung 32 Bit, d.h. 2 Chars lang sind (Surrogaten-Paare).
    Übrigens: Unicode bezeichnet einen Standard (an international gültigen Buchstaben), Utf-8 bspw. die spezifische Codierung, soweit ich weiß.

    Viele Grüße
    ~blaze~
    @RodFromGermany: Ja, dachte mir fast, dass dieses Beispiel dafür kommt. Hatte ich auch schon ohne Erfolg versucht.
    @~blaze~: Auch das hatte ich tatsächlich schon versucht.

    Also nochmal zu dem Problem hier:

    Mein Code funktioniert so wie er ist ab und zu. Deswegen frag ich mich wieso nicht immer ? was ist da der Grund ? Wie funktioniert er wirklich 100%ig ? Ich bekomme z.B. Als Rückgabewert für mein ByteArray: 116 144 180 9 168 5 was funktioniert, aber beim nächsten Versuch bricht er z.B. bei bytes(2) ab mit der obigen Fehlermeldung, also bytes(0) = 214 und bytes(1) = 206 gibt er mir noch aber für mein chars(2) = "—"c bricht er dann ab ?! aus welchem Grund ? Das steht doch auch in der ASCII-Tabelle und müsste mir doch in bytes(3) die 151 eintragen ?! mag er aber nicht...versteh ich net.

    VB.NET-Quellcode

    1. Public Shared Function xyz() As Byte()
    2. Dim key As New StringBuilder
    3. 'Funktionsaufruf mit Rückgabewert key
    4. If key IsNot Nothing Then
    5. Dim chars As Char() = key.ToString().ToCharArray()
    6. Dim bytes(chars.Length - 1) As Byte
    7. 'Dim value As String = New String(chars)
    8. 'Dim words As String()
    9. 'words = value.Split(TryCast(Nothing, String()), StringSplitOptions.RemoveEmptyEntries)
    10. For i As Integer = 0 To chars.Length - 1
    11. bytes(i) = Convert.ToByte(chars(i)) 'Funktioniert ab und zu
    12. 'bytes(i) = StrToByteArray() 'String wie ?!
    13. 'bytes(i) = UnicodeStringToBytes() 'String wie ?!
    14. 'bytes(i) = StrToByteArray2(chars(i)) 'Funktioniert auch nicht wirklich
    15. 'Von unsigned in signed bringts wohl auch überhaupt nicht...
    16. 'Dim bytes As Byte() = {0, 1, 127, 128, 255}
    17. 'For Each b As Byte In bytes
    18. 'MessageBox.Show(ConvertUnsignedToSigned(b).ToString())
    19. 'Next b
    20. Debug.Print(bytes(i))
    21. Next
    22. Return bytes
    23. Else
    24. Return New Byte() {}
    25. End If
    26. End Function
    27. Public Shared Function StrToByteArray(str As String) As Byte()
    28. Dim encoding As New System.Text.ASCIIEncoding()
    29. Return encoding.GetBytes(str)
    30. End Function
    31. Public Shared Function StrToByteArray2(value As Char) As Byte
    32. Return AscW(value)
    33. End Function
    34. Public Shared Function UnicodeStringToBytes(ByVal str As String) As Byte()
    35. Return System.Text.Encoding.Unicode.GetBytes(str)
    36. End Function

    Wenn ich Sie jetzt um Sex bitten würde – wäre Ihre Antwort die gleiche, die Sie auf diese Frage geben? ;)

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „chaos_progger“ ()

    ~blaze~ schrieb:

    Zur Info: Chars sind 16-Bit-Werte, Byte und signed Byte besitzen aber nur 8 Bits, weshalb auf jeden Char theoretisch 2 Bytes kommen


    Erklärt das nicht die Ursache des Problems? ASCII geht nur von 0 bis 127, jew. einschließlich, Byte von 0 bis 255, Char aber von 0 bis 65535.
    Zudem sollte eigentlich StrToByteArray2 nicht korrekt sein, sofern Option Strict auf On ist. AscW gibt eine Instanz von Integer zurück und ist folglich kein Byte und kann auch nicht implizit zu einem konvertiert werden. Außerdem darfst du System.Text.Encoding.ASCII (ist eine statische Eigenschaft) verwenden, statt jedes mal eine Instanz der System.Text.ASCIIEncoding-Klasse zu erstellen.

    Viele Grüße
    ~blaze~

    ~blaze~ schrieb:

    Unicode

    RodFromGermany schrieb:

    Das geht über Encoding
    Da muss der @TE bzw. @chaos_progger natürlich das richtige solche auswählen. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @~blaze~: Ohjee...ich hab grad gecheckt, dass ich ja 255 verschiedene Zeichen zurückgegeben bekommen kann, was heisst ich habe hier gar keinen ASCII-Code, sondern ANSI-Code :S

    ohjeee...

    code-knacker.de/ansi.htm

    Das sollte man sich dazu dann auch mal durchgelesen haben.

    sttmedia.de/unicode-utf8

    Mal schauen ob ich mit der Erkenntnis weiterkomme... :rolleyes:


    @RodFromGermany: alles klar, heisst so viel wie versuchs einfach weiter. weil wenns für mich so einfach wäre, hätte ich das Problem schon gelöst.
    Wenn ich Sie jetzt um Sex bitten würde – wäre Ihre Antwort die gleiche, die Sie auf diese Frage geben? ;)
    Also hab jetzt das problem bei kriechischen schriftzeichen: prntscr.com/631pk3 (soll soetwas wie ein editor für spieldateien sein)
    Da kommt bei jedem encoding ungefähr das selbe raus, nurnicht das was reingehört.


    VB.NET-Quellcode

    1. Dim array() As Byte = System.Text.Encoding.Unicode.GetBytes("Χρυσός")
    2. For i = 0 To array.lengh - 1
    3. bw2.Write(array(i))
    4. Next i

    Wer Rechtschreibfehler findet darf sie behalten :)

    chaos_progger schrieb:

    heisst so viel wie versuchs einfach weiter
    Nö.
    Eher "Denk drüber nach".
    Geh einen Schritt zurück und betrachte das Gesamtproblem.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    "Denk drüber nach".

    :thumbdown: Das ist das gleiche nur anders ausgedrückt ! Hat mir jetzt nicht sonderlich weitergeholfen...

    Ich glaube ja ich habe es fast und bin nah dran, soviel wie ich schon ausprobiert hab. Vielleicht gibt mir jemand anders ja hier nochmal einen Tipp.

    "System.ArgumentOutOfRangeException"
    Der Index und die Anzahl müssen sich auf eine Position in der Zeichenfolge beziehen.

    VB.NET-Quellcode

    1. If key IsNot Nothing Then
    2. Dim chars As Char() = key.ToString().ToCharArray()
    3. Dim bytes(chars.Length - 1) As Byte
    4. Dim asc As Encoding = Encoding.ASCII
    5. Dim j As Integer = chars.Length - 1
    6. For i As Integer = 1 To j
    7. 'Beim Überschreiben in einer abgeleiteten Klasse werden die Zeichen aus dem angegebenen Zeichenarray in das angegebene Bytearray codiert
    8. 'chars = Das Zeichenarray, das die zu codierenden Zeichen enthält
    9. 'charIndex = Der Index des ersten zu codierenden Zeichens
    10. 'charCount = Die Anzahl der zu codierenden Zeichen
    11. 'bytes = Das Bytearray, das die sich ergebende Bytefolge enthalten soll
    12. 'byteIndex = Der Index, an dem mit dem Schreiben der sich ergebenden Bytefolge begonnen werden soll
    13. asc.GetBytes(chars(i), i, j, bytes, i)
    14. Debug.Print(bytes(i))
    15. Next
    16. Return bytes
    17. Else
    18. Return New Byte() {}
    19. End If
    Wenn ich Sie jetzt um Sex bitten würde – wäre Ihre Antwort die gleiche, die Sie auf diese Frage geben? ;)

    chaos_progger schrieb:

    Das ist das gleiche nur anders ausgedrückt
    Sinnentstellendes Zitat. X(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was genau willst du denn? Willst du einfach nur Bytes, die den entsprechenden Buchstaben beschreiben oder muss es ASCII sein? Mit ASCII kannst du alles, was die Buchstaben 0 bis 127 überschreitet, vergessen. Und hat es einen Grund, warum du die Chars einzeln decodieren willst?

    @RodFromGermany : Das heißt mMn. einfach nur, dass dein Beitrag nicht hilfreich ist, zumindest ist das meine Interpretation und ehrlich gesagt brächte mir dein Beitrag auch keine Lösung.

    Viele Grüße
    ~blaze~
    @~blaze~: Ja genau mit ASCII kann ich es wahrscheinlich vergessen. Steht im Code oben noch drin, da es mit den anderen auch nicht funktioniert hatte wie z.B.

    VB.NET-Quellcode

    1. Dim def As Encoding = Encoding.Default
    2. Dim u16BE As Encoding = Encoding.BigEndianUnicode
    3. Dim u32 As Encoding = Encoding.UTF32


    00 bis 32 = Steuerbefehle (nicht darstellbare Zeichen) [Alternativzeichen unter Windows - CP850] <--brauche ich nicht
    33 bis 127 = Sind mit dem ASCII-Zeichensatz übereinstimmend <--brauche ich !!
    128 bis159 = undefiniert <--brauche ich nicht <-- EDIT: ok, brauch ich auch !!
    160 bis 255 = Übereinstimmung mit Unicode "C1 Controls and Latin-1 Supplement" <--brauche ich !!

    Also, ich hab mir noch gedacht ich schreibe mir das vielleicht einfach alles selbst z.B. auf die Art?

    VB.NET-Quellcode

    1. Public Function ChrToByte1(chr As Char) As Byte
    2. Select Case chr
    3. Case Is = "!"
    4. ChrToByte1 = 33
    5. End Select
    6. End Function


    edit: ja genau, ich wollte sagen, Rods Beitrag war nicht hilfreich für mich und zudem benutzt du bei anderen doch auch nie das vollständige Zitat, sondern lässt ständig das meiste weg und wenn ich das einmal mache ist es gleich sinnentstellend ?!
    Wenn ich Sie jetzt um Sex bitten würde – wäre Ihre Antwort die gleiche, die Sie auf diese Frage geben? ;)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „chaos_progger“ ()

    Hier ein Beispiel, wie die Bytes bei unterschiedlichen Encodings aussehen.
    Nicht konvertierbare Zeichen werden durch "?" (3F) ersetzt.

    Ausführbares Konsolenprogramm:

    VB.NET-Quellcode

    1. Imports System.Text
    2. Module Module1
    3. Sub Main()
    4. Dim Str As String = "터보 경험치 초콜릿(3H)äöü"
    5. 'Koreanisch + äöü
    6. Dim ByteArray() As Byte, i As Integer = 0
    7. ByteArray = Encoding.UTF8.GetBytes(Str)
    8. Console.WriteLine("UTF8-Bytes")
    9. For i = 0 To ByteArray.Length - 1
    10. Console.Write(ByteArray(i).ToString("X2") & " ")
    11. Next
    12. Console.WriteLine(vbCrLf)
    13. Console.WriteLine("UTF16-Bytes")
    14. ByteArray = Encoding.Unicode.GetBytes(Str)
    15. For i = 0 To ByteArray.Length - 1
    16. Console.Write(ByteArray(i).ToString("X2") & " ")
    17. Next
    18. Console.WriteLine(vbCrLf)
    19. Console.WriteLine("Default(CP1252)-Bytes - ?? ??? ???(3H)äöü")
    20. ByteArray = Encoding.Default.GetBytes(Str)
    21. For i = 0 To ByteArray.Length - 1
    22. Console.Write(ByteArray(i).ToString("X2") & " ")
    23. Next
    24. Console.WriteLine(vbCrLf)
    25. Console.WriteLine("ASCII-Bytes - ?? ??? ???(3H)???")
    26. ByteArray = Encoding.ASCII.GetBytes(Str)
    27. For i = 0 To ByteArray.Length - 1
    28. Console.Write(ByteArray(i).ToString("X2") & " ")
    29. Next
    30. Console.WriteLine(vbCrLf)
    31. Console.WriteLine("CP949 (Koreanisch)-Bytes - aus äöü wird aou (61 6F 75)")
    32. ByteArray = Encoding.GetEncoding(949).GetBytes(Str)
    33. For i = 0 To ByteArray.Length - 1
    34. Console.Write(ByteArray(i).ToString("X2") & " ")
    35. Next
    36. Console.ReadKey()
    37. End Sub
    38. End Module
    also ich hab jetzt endlich mein(e) Problem(e) gelöst :D und sogar nicht auf dem zuvor beschriebenen Weg, sondern mit Encoding.Default. Falls es irgendjemand interessieren sollte, kann ichs nochmal posten aber für mich ist das Thema glaub ich gegessen, ich wäre raus. :thumbsup:
    Wenn ich Sie jetzt um Sex bitten würde – wäre Ihre Antwort die gleiche, die Sie auf diese Frage geben? ;)