Maximale Zeichenanzahl in einem Arrayfeld

  • Hallo. Nachdem ich ja norlich schonmal Probleme mit der generellen Größe eines Arrays hatte, habe ich nun Probleme mit der Inhaltsgröße eines Datenfeldes. Ich habe einen binären inhalt mit 84.000 Zeichen. Im _ArrayDisplay wird das nicht angezeigt. Bzw. generell keine Zeichenfolgen wie diese hier:

    Spoiler anzeigen

    00000000 00 00 00 00 00 00 00 00 - 01 00 00 00 02 00 00 00 ................

    Wie kann das sein?

    Einmal editiert, zuletzt von Scritch (24. August 2012 um 11:48)

  • Ich weiss gerade nicht, wie ich das als Minibeispiel darstellen soll. Ich versuche es nochmal zu erklären:
    Es geht wieder darum, die Registry auf Änderungen hin auszuwerten. Dabei hat man dann Inhalte von den Datenfeldern (die Registry wird aus einer Textdatei in ein Array eingelesen) wie diese hier:

    Spoiler anzeigen

    Schlüsselname: HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi\Scsi Port 2\SCSI Bus 0\Target Id 0\Logical Unit Id 0
    Klassenname: <KEINE KLASSE>
    Letzter Schreibzugriff: 14.08.2012 - 08:04
    Wert 0
    Name: Type
    Typ: REG_SZ
    Daten: CdRomPeripheral

    Wert 1
    Name: DeviceType
    Typ: REG_SZ
    Daten: CdRomPeripheral

    Wert 2
    Name: Identifier
    Typ: REG_SZ
    Daten: MagicISOVirtual DVD-ROM 1.0A

    Wert 3
    Name: InquiryData
    Typ: REG_BINARY
    Daten:
    00000000 05 80 02 02 20 00 00 10 - 4d 61 67 69 63 49 53 4f .... ...MagicISO
    00000010 56 69 72 74 75 61 6c 20 - 44 56 44 2d 52 4f 4d 20 Virtual DVD-ROM
    00000020 31 2e 30 41 1.0A

    Wert 4
    Name: DeviceName
    Typ: REG_SZ
    Daten: CdRom1


    Genau so steht es in der Textdatei. Und so wie es in der Textdatei steht, will ich es auch auswerten. Ich wollte diesen String jetzt teilen in verschiedene Strings und das in ein anderes Array schreiben. Schlüsselname, Klassenname und Letzter Schreibzugriff jeweils in eine Spalte und danach dann die Inhalte der jeweiligen Werte je in eine Spalte. Aber da scheiterts. Name und Typ werden korrekt geschrieben. Die Daten jedoch nicht. Hinter Daten steht dann später gar nichts.

  • Ich weiß ohne Minimalbeispiel nicht wie du auf die Daten zugreifst und sie einzeln verabeitest.
    Erst so sieht man ob Typumwandlungen vorgenommen werden oder nicht.
    Wenn du z.B. irgendwo ein BinaryToString machst ist klar warum im String nichts angezeigt wird.

  • Mit Typumwandlungen arbeite ich nicht. Hier mal mein Skript, ist vom umfang noch überschaubar. Daten werden wie gesagt aus einer Textdatei ins Array eingelesen und auch ohne große Umwandlungen weiter verarbeitet.

    Spoiler anzeigen
    [autoit]

    #include <file.au3>
    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $Reg_vorher = @ScriptDir & "\reg_vorher.txt"
    Global $aReg_vorher ;Pure eingelesene Registry in eine 1D-Array

    [/autoit] [autoit][/autoit] [autoit]

    dim $aAufteilung[2][4] ;Schlüsselname|Klassenname|Letzter schreibzugriff
    _filereadtoarray($Reg_vorher, $aReg_vorher)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    for $i = 0 to UBound($aReg_vorher) - 1
    if StringInStr($aReg_vorher[$i], "Schlüsselname") > 0 Then
    redim $aAufteilung[ubound($aAufteilung) + 1][ubound($aAufteilung, 2)]
    $aAufteilung[ubound($aAufteilung) - 1][0] = StringMid($aReg_vorher[$i], 15) ;Schlüsselname
    $aAufteilung[ubound($aAufteilung) - 1][1] = Stringmid($aReg_vorher[$i + 1], 13) ;Klassenname
    $aAufteilung[ubound($aAufteilung) - 1][2] = Stringmid($aReg_vorher[$i + 2], 24) ;Letzter Schreibzugriff
    ElseIf StringInStr($aReg_vorher[$i], "Wert") > 0 Then
    $Werthoehe = StringMid($aReg_vorher[$i], 5)
    if $Werthoehe = 0 Then
    $aAufteilung[ubound($aAufteilung) - 1][3] = $aReg_vorher[$i + 1] & $aReg_vorher[$i + 2] & $aReg_vorher[$i + 3]
    Else
    if ubound($aAufteilung, 2) >= (4 + $Werthoehe) Then
    $aAufteilung[ubound($aAufteilung) - 1][3 + $Werthoehe] = $aReg_vorher[$i + 1] & $aReg_vorher[$i + 2] & $aReg_vorher[$i + 3]
    Else
    ReDim $aAufteilung[ubound($aAufteilung)][4 + $Werthoehe] ;vorher prüfen, ob array schon groß genug
    $aAufteilung[ubound($aAufteilung) - 1][(3 + $Werthoehe)] = $aReg_vorher[$i + 1] & $aReg_vorher[$i + 2] & $aReg_vorher[$i + 3]
    EndIf
    EndIf
    EndIf
    Next
    _arraydisplay($aAufteilung)

    [/autoit]

    Edit: Hier habt ihr nochmal eine abgespeckte Datei von der Registry, wo man das nachstellen kann:

  • Wo stammen diese Daten in diesem Format her?
    Das ist ja furchtbar um es maschinell auszuwerten.
    Auch wenn ich natürlich nicht völlig durchsteige was du mit den ganzen $i+x immer genau gemeint hast denke ich das Problem liegt eher irgendwo daran dass du ab "Wert" immer nur maximal 3 Zeilen weiter gehst ( [$i + 3] ).
    Die Daten welche bei dir nicht angezeigt werden beginnen aber auf der 4. Zeile welche gar nicht ausgewertet wird.

  • Ja, das auszuwerten ist in der Tat furchtbar. Die Datei stammt direkt aus der Microsoft Registry aus der Exportieren-Funktion. Da kann man auch das Dateiformat .txt halt auswählen.

    Jetzt wo ich das hier schreibe und gerade nochmal in den Code geschaut habe, gebe ich dir natürlich Recht. Anfängerfehler. Wie du richtig gesehen hast, werte ich immer nur die 3 Zeilen aus, obwohl die Daten auch in Zeile 4, 5, 6,... stehen. Blöder Fehler :pinch:

    Aber dann hast du mir jetzt doch noch geholfen, ih n zu finden. Dafür danke ich dir :)

    Mal schauen ob er dann den ganzen binären Krams auch richtig auswertet.

    Edit: Aber um das nochmal zu klären: Wie groß darf ein Array Datenfeld maximal sein?

  • Ja, das auszuwerten ist in der Tat furchtbar. Die Datei stammt direkt aus der Microsoft Registry aus der Exportieren-Funktion. Da kann man auch das Dateiformat .txt halt auswählen.


    Dann solltest du die Einträge als .reg exportieren, dann sollte das Auslesen sogar mit den Ini-Funktionen machbar sein...