none
Merkwürdiges beim Speichern von Integer Werten RRS feed

  • Frage

  • Hallo, zum Bearbeiten einer FITS-Datei kann der Header und der Datenblock getrennt exportiert werden. Der Datenblock wird als txt-Datei im cvs Format angelegt. Die Daten können dann in Excel manipuliert werden. Leider gibt es kein Tool um diese Blöcke wieder zu importieren, so dass man das selbst zu Fuß machen muss. Dabei ist mir eine Merkwürdigkeit aufgefallen, dass das Speichern der Integer Werte nicht mit den Ausgangswerten kompatibel ist. In Folge einige Auszüge aus den entsprechenden Dateien.

    1. Ausgangsdatei Datenteil (die ersten 24 Werte):

    00000000000000000000000000000000 0000000F000000000000000000000000 00000000000000000000000000000000 0000000000000000000001EA00000173 0000016E0000037A0000045E000004F6 00000A93000012B20000235000003CF7

    2.csv-Datei:

    = 0 ;0 ;0 ;0 ;15 ;0 ;0 ;0 ;0 ;0 ;0 ;0 ;0 ;0 ;490 ;371 ;366 ;890 ;1118 ;1270 ;2707 ;4786 ;9040 ;15607 

    3. importierte Datei:

    00000000000000000000000000000000 0F000000000000000000000000000000 00000000000000000000000000000000 0000000000000000EA01000073010000 6E0100007A0300005E040000F6040000 930A0000B212000050230000F73C0000

    Die Darstellung der Integer Werte in der Originaldatei ist rechtsbündig, also höchstwertiges Byte ist links, in der importierten Datei ist der Integer Wert linksbündig, das höchstwertige Byte ist rechts. Wieso????

    Anbei der Code zur Übernahme der Integer Werte

          
     Dim daten As String
            Dim param() As String
            Dim datarray() As Integer
            daten = My.Computer.FileSystem.ReadAllText(csvname)
            daten = daten.Replace(" ", "")
            daten = daten.Replace(vbCrLf, "")
            param = daten.Split(";")
    
            ReDim datarray(param.Count)
            For i = 0 To param.Count - 1
                If param(i) = "0" Then
                    datarray(i) = 0
                Else
                    datarray(i) = Val(param(i))
                End If
            Next
    
            sr.Close()
    
            Dim ft = New IO.FileStream(fitsname, IO.FileMode.Open, IO.FileAccess.Write)
            Dim bw As New IO.BinaryWriter(ft)
            For i = 0 To param.Count - 1
                bw.Seek(hdrblk, IO.SeekOrigin.Begin)
                bw.Write(datarray(i))
                hdrblk += 4
            Next
    
            bw.close


    Gruß Richard Bartetzko
    Donnerstag, 27. September 2018 10:15

Antworten

  • Hi Richard,
    zuerst solltest Du Option Strict On setzen, um auch die volle Kontrolle über Deine Typkonvertierungen zu haben. So liefert z.B. die Methode Val eine Gleitkommazahl, die Du ohne Konvertierung einer Ganzzahl (integer) zuweist.

    Dein eigentliches Problem liegt aber in der Darstellung von Zahlen in der Intel-Technologie. So werden Zahlen byteweise vom niedrigwertigen Byte zum höherwertigen Byte ablegt (Little-Endian), anders herum, als Du das bekommst (Big-Endian). Schau mal hier.

    Du kannst die Integer-Zahl einfach konvertieren, z.B. über ein Byte-Array mit Reverse oder mit Overlay Struktur. 



    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 27. September 2018 18:09