Von Hex zu Binär und wieder zurück

  • Hallo Community,

    ich arbeite da gerade an etwas. Der Sinn dahinter bleibt vorerst geheim ;)

    Nun zum Problem. Ich habe gerade mal folgendes Skript runtergeschrieben:

    Spoiler anzeigen
    [autoit]


    Dim $result

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

    $data = FileOpen("logo.jpg", 16)
    $hex = FileRead($data)

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

    $binary = StringTrimLeft($hex, 2)

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

    FileWrite("string1.txt", $binary)

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

    $binary = HexToBinary($binary)

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

    $aNumber = StringRegExp($binary, "\d{4}", 3)

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

    For $i = 0 To UBound($aNumber) - 1
    $result &= BinaryToHex($aNumber[$i])
    Next

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

    FileWrite("string2.txt", $result)

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

    FileWrite("logo2.jpg", $result)

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

    Func HexToBinary($binary)
    $binary = StringReplace($binary, "0", "0000")
    $binary = StringReplace($binary, "1", "0001")
    $binary = StringReplace($binary, "2", "0010")
    $binary = StringReplace($binary, "3", "0011")
    $binary = StringReplace($binary, "4", "0100")
    $binary = StringReplace($binary, "5", "0101")
    $binary = StringReplace($binary, "6", "0110")
    $binary = StringReplace($binary, "7", "0111")
    $binary = StringReplace($binary, "8", "1000")
    $binary = StringReplace($binary, "9", "1001")
    $binary = StringReplace($binary, "A", "1010")
    $binary = StringReplace($binary, "B", "1011")
    $binary = StringReplace($binary, "C", "1100")
    $binary = StringReplace($binary, "D", "1101")
    $binary = StringReplace($binary, "E", "1110")
    $binary = StringReplace($binary, "F", "1111")
    Return $binary
    EndFunc

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

    Func BinaryToHex($binary)
    $binary = StringReplace($binary, "0000", "0")
    $binary = StringReplace($binary, "0001", "1")
    $binary = StringReplace($binary, "0010", "2")
    $binary = StringReplace($binary, "0011", "3")
    $binary = StringReplace($binary, "0100", "4")
    $binary = StringReplace($binary, "0101", "5")
    $binary = StringReplace($binary, "0110", "6")
    $binary = StringReplace($binary, "0111", "7")
    $binary = StringReplace($binary, "1000", "8")
    $binary = StringReplace($binary, "1001", "9")
    $binary = StringReplace($binary, "1010", "A")
    $binary = StringReplace($binary, "1011", "B")
    $binary = StringReplace($binary, "1100", "C")
    $binary = StringReplace($binary, "1101", "D")
    $binary = StringReplace($binary, "1110", "E")
    $binary = StringReplace($binary, "1111", "F")
    Return $binary
    EndFunc

    [/autoit]


    Bitte nicht hauen. Es geht auch sauberer, aber ich wollte es eben mal testen.

    Wie ihr sehen könnt, speichere ich beide Strings wieder ab um diese dann mal zu vergleichen. Diese sind komplett identisch.
    Nur wenn ich das Bild wieder erzeugen möchte, gibt er mir ein doppelt so großes, unbrauchbares Bild wieder aus.

    Vllt. habt ihr ja einen Lösungsansatz.

    Viele Grüße,
    sh0r7y

    Einmal editiert, zuletzt von sh0r7y (22. September 2013 um 22:00)

  • Das Problem besteht im Datentyp den du FileWrite übergibst.
    Der Datentyp ist "String", somit wird in das JPG Bild der HexString geschrieben, anstatt der eigentliche Inhalt.
    Dazu gibt es 2 Lösungen.
    1. Benutzung von Binary to String ( mit '0x' & $result)
    2. Casten zum korrekten Datentyp Binary('0x' & $result)
    In Fall 1 wird das Problem umgangen indem der HexString manuell in den richtigen Inhalt umgewandelt wird.
    In Fall 2 wird das Problem gelöst indem FileWrite Daten vom Typ Binary erhält die es anschließend auch richtig verwaltet.

    Spoiler anzeigen
    [autoit]

    Dim $result

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

    $data = FileOpen("logo.jpg", 16)
    $hex = FileRead($data)

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

    $binary = StringTrimLeft($hex, 2)

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

    FileWrite("string1.txt", $binary)

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

    $binary = HexToBinary($binary)

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

    $aNumber = StringRegExp($binary, "\d{4}", 3)

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

    For $i = 0 To UBound($aNumber) - 1
    $result &= BinaryToHex($aNumber[$i])
    Next

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

    FileWrite("string2.txt", $result)

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

    FileWrite("logo2_bin.jpg", Binary('0x' & $result))
    FileWrite("logo2_bin2str.jpg", BinaryToString('0x' & $result))

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

    Func HexToBinary($binary)
    $binary = StringReplace($binary, "0", "0000")
    $binary = StringReplace($binary, "1", "0001")
    $binary = StringReplace($binary, "2", "0010")
    $binary = StringReplace($binary, "3", "0011")
    $binary = StringReplace($binary, "4", "0100")
    $binary = StringReplace($binary, "5", "0101")
    $binary = StringReplace($binary, "6", "0110")
    $binary = StringReplace($binary, "7", "0111")
    $binary = StringReplace($binary, "8", "1000")
    $binary = StringReplace($binary, "9", "1001")
    $binary = StringReplace($binary, "A", "1010")
    $binary = StringReplace($binary, "B", "1011")
    $binary = StringReplace($binary, "C", "1100")
    $binary = StringReplace($binary, "D", "1101")
    $binary = StringReplace($binary, "E", "1110")
    $binary = StringReplace($binary, "F", "1111")
    Return $binary
    EndFunc

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

    Func BinaryToHex($binary)
    $binary = StringReplace($binary, "0000", "0")
    $binary = StringReplace($binary, "0001", "1")
    $binary = StringReplace($binary, "0010", "2")
    $binary = StringReplace($binary, "0011", "3")
    $binary = StringReplace($binary, "0100", "4")
    $binary = StringReplace($binary, "0101", "5")
    $binary = StringReplace($binary, "0110", "6")
    $binary = StringReplace($binary, "0111", "7")
    $binary = StringReplace($binary, "1000", "8")
    $binary = StringReplace($binary, "1001", "9")
    $binary = StringReplace($binary, "1010", "A")
    $binary = StringReplace($binary, "1011", "B")
    $binary = StringReplace($binary, "1100", "C")
    $binary = StringReplace($binary, "1101", "D")
    $binary = StringReplace($binary, "1110", "E")
    $binary = StringReplace($binary, "1111", "F")
    Return $binary
    EndFunc

    [/autoit]


    lg
    Mars

  • Ich glaube bei den Script können fehler vorkommen

    Wenn man z.B C2 umwandeln will in binär, sieht es so aus: 1100 0011 Also 11000011
    Aber da 0000 ( = 0 ) zuerst wieder zurück gewandelt wird wird es dann so aussehen: 11011, und somit kann der String nicht mehr in der Ursprünglichen Form zurück gewandelt werden.

    Sorry fals ich mich irre^^

    Ich würd deinerstelle dann z.B den 1100 0011 String in einer Array splitten, welche dann ein nach den anderen umgewandelt wird.

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • der is gut:

    [autoit]

    $binary = StringReplace($binary, "0000", "0")

    [/autoit]

    :D

    gibt übrigens massenweise funktionen, schreib dir doch selbst eine, in der das alles errechnet, statt ersetzt wird, dann lernst es gescheit :)

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • gibt übrigens massenweise funktionen, schreib dir doch selbst eine, in der das alles errechnet, statt ersetzt wird, dann lernst es gescheit :)


    Das es besser geht weiß ich ja :D
    Wird später eh in C++ umgeschrieben, damit es schneller läuft.

    Vielleicht kriege ich es sogar heute schon fertig :)

  • BugFix Ok^^, in RegExp kenn ich mich nicht so gut aus^^

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes: