And Operator für Integer und Char nicht definiert

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    And Operator für Integer und Char nicht definiert

    Wie kann ich das Char() in Integer() umwandeln?


    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Private Sub ReadHeader()
    2. ' bring in the first three bytes. it must be ID3 or we have no tag
    3. ' TODO add logic to check the end of the file for "3D1" and other
    4. ' possible starting spots
    5. Dim id3start As New String(br.ReadChars(3))
    6. ' check for a tag
    7. If Not id3start.Equals("ID3") Then
    8. ' TODO we are fucked.
    9. 'throw id3v2ReaderException;
    10. Me.hasTag = False
    11. Return
    12. Else
    13. Me.hasTag = True
    14. ' read id3 version. 2 bytes:
    15. ' The first byte of ID3v2 version is it's major version,
    16. ' while the second byte is its revision number
    17. Me.MajorVersion = System.Convert.ToInt32(br.ReadByte())
    18. Me.MinorVersion = System.Convert.ToInt32(br.ReadByte())
    19. 'read next byte for flags
    20. Dim boolar As Boolean() = BitReader.ToBitBool(br.ReadByte())
    21. ' set the flags
    22. Me.FA_Unsynchronisation = boolar(0)
    23. Me.FB_ExtendedHeader = boolar(1)
    24. Me.FC_ExperimentalIndicator = boolar(2)
    25. ' read teh size
    26. ' this code is courtesy of Daniel E. White w/ minor modifications by me Thanx Dan
    27. 'Dan Code
    28. Dim tagSize As Char() = br.ReadChars(4)
    29. ' I use this to read the bytes in from the file
    30. Dim bytes As Integer() = New Integer(3) {}
    31. ' for bit shifting
    32. Dim newSize As ULong = 0
    33. ' for the final number
    34. ' The ID3v2 tag size is encoded with four bytes
    35. ' where the most significant bit (bit 7)
    36. ' is set to zero in every byte,
    37. ' making a total of 28 bits.
    38. ' The zeroed bits are ignored
    39. '
    40. ' Some bit grinding is necessary. Hang on.
    41. bytes(3) = tagSize(3) Or ((tagSize(2) And 1) << 7)
    42. bytes(2) = ((tagSize(2) >> 1) And 63) Or ((tagSize(1) And 3) << 6)
    43. bytes(1) = ((tagSize(1) >> 2) And 31) Or ((tagSize(0) And 7) << 5)
    44. bytes(0) = ((tagSize(0) >> 3) And 15)
    45. newSize = (CType(10, UInt64) + CType(bytes(3), UInt64) Or (CType(bytes(2), UInt64) << 8) Or (CType(bytes(1), UInt64) << 16) Or (CType(bytes(0), UInt64) << 24))
    46. 'End Dan Code
    47. Me.headerSize = newSize
    48. End If
    49. End Sub

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

    @Morrison Oder Du konvertierst das Byte-Array in ein Integer-Array.
    Alle diese Operatoren arbeiten auf Integer oder auf Long, weil die direkt auf dem Prozessor laufen, da muss jede kleinere Einheit (Byte, Short, ...) explizit konvertiert werden.
    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!

    Morrison schrieb:

    In Zeile 29. wird tagSize als Char() deklariert.
    nicht nur deklariert, sondern wird auch als Char() ausgelesen.
    Was höchstwahrscheinlich falsch ist.
    Also wenn da eine TagSize steht, dann doch sicher in numerischer Form, also Short oder Integer.

    Aber vlt. steht da auch wirklich Text - weiss man ja nicht.
    Dann würde ich den aber auch als Text auslesen:

    VB.NET-Quellcode

    1. Dim tagSize = new String(br.ReadChars(4))
    Probier das mal aus, ob auf diese Weise ein sinnvoller String zustande kommt.

    Morrison schrieb:

    Und der/die Fehler kommt in Zeile 43. - 46.!
    Klar.
    Dort machst Du Operationen mit Nicht-Integers, die nur für Integer definiert sind.
    Char sind alphanumerische Zeichen. Wie willst Du denn "R" Or "K" >> 1 behandeln?
    Du musst diese Chars richtig in Integer konvertieren. Was jetzt hier "richtig" ist, musst Du anhand der Datenherkunft und Weiterbehandlung selbst ermitteln bzw. definieren. Wenn wir Dir da was vorschlagen, isses mit hoher Wahrscheinlichkeit falsch.
    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: Erstmal sollte es "R"c Or "K"c >> 1 sein, dann sollte es behandelt werden wie in so vielen anderen Sprachen auch, schließlich sind chars intern auch nichts anderes als Zahlen, die kann man dann auch wunderbar wie Zahlen behandeln, funktioniert in C/C++/C#(begrenzt)/Python und bestimmt noch vielen mehr
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    ErfinderDesRades schrieb:

    Probier das mal aus, ob auf diese Weise ein sinnvoller String zustande kommt.


    Das Problem ist, das die TagGroesse kein String ist. Bei ID3V2-Tags wird die Taggroesse mit 4 Bytes angegeben, um die Groesse aber etwas zu beschraenken, werden halt nur 7 Bits pro Byte verwendet.

    Auf des ID3V2-Headers, bestehend aus 10 Bytes.
    ID3v2/file identifier "ID3"
    ID3v2 version $03 00
    ID3v2 flags %abc00000
    ID3v2 size 4 * %0xxxxxxx

    id3.org/id3v2.3.0

    Also passt das, wenn er statt Chars Bytes nimmt.
    Dim tagsize As Integer = (b(3) And &HFF) Or ((b(2) And &HFF) << 7) Or ((b(1) And &HFF) << 14) Or ((b(0) And &HFF) << 21)

    And i think to myself... what a wonderfuL World!

    jvbsl schrieb:

    die kann man dann auch wunderbar wie Zahlen behandeln
    nachdem sie iwie in Zahlen konvertiert wurden.
    Bill hat sich schon was bei gedacht, dass er Char und (U)Short disjunkt definierte.
    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!
    Ach, hat er das? Und was hat er dann gedacht als man C# gemacht hat, oder IL allgemein. Oder hat sich Dennis Ritchie etwa nichts gedacht, oder Bjarne Stroustrup?
    Wer hat sich dann etwas gedacht, bei switch case auf strings?(Switch hat eigt. seinen Grund in möglichen Optimierungen, die bei etwas wie Strings nicht funktionieren -> und .Net ist im Optimieren vergleichsweise sowieso miserabel)

    Also Nur weil sich jemand irgendwann mal etwas gedacht hat, heißt das nicht unbedingt, dass es deshalb Sinn ergibt und Richtig ist. Char ist bestimmt nicht disjunkt, weil man sie nicht wie Zahlen behandeln können soll.

    C#-Quellcode

    1. int x = 'R' | 'K' >> 1;

    Wie du siehst findet eine "Konvertierung" implizit statt. Doch selbst die implizite Konvertierung löst sich am Ende in genau gar nichts auf, da ist also nur eine Konvertierung damit der Compiler es schluckt, aber am Ende findet tatsächlich überhaupt keine Konvertierung statt.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    als man C# gemacht hat
    Laut @TE reden wir hier immer noch von VB.NET, und da ist diese Operation nun mal nicht definiert:

    Allerdings ist es durchaus merkwürdig, was in C# und in VB.NET wechselweise geht bzw. nicht geht.
    In VB.NET gibt es keine automatische Konvertierung zwischen Char und Integer, wohl aber eine automatische Konvertierung zwischen allem Möglichen, wenn man mit der Default-Vorgabe Option Strict Off arbeitet. ;(
    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!

    Eddy schrieb:

    Also passt das, wenn er statt Chars Bytes nimmt.
    Ok - dass du die Doku iwo aufgetrieben hast ist mal was mit Hand und Fuss.
    Und dann ergibt sich, dass man natürlich Bytes lesen sollte - ist mit dem BinaryReader ja ebenso vorgesehen wie Chars zu lesen. Sagte ich ja schon in post#7, dass diesem Tagsize-Wert mit .ReadChars() beizukommen zu versuchen höchst zweifelhaft ist.