Wie erstelle ich einen RS-Code ?

  • Moin,

    inzwischen kennt ja (fast) jeder die QR-Codes oder andere Sachen in der Art.

    So etwas ähnliches möchte ich auch mal basteln. Allerdings fehlt mir dazu die Möglichkeit das ganze Fehlertolerant zu gestalten.
    Wenn man die Grafiken mit dem PC verschickt ist das nicht nötig, aber sobald man schon ein jpg-Bild nutzt, oder womöglich noch den eigentlichen Verwendungszweck, das fotografieren mit einem Handy praktizieren will, kommt man so nicht weit.

    Nach wenigen Nachforschungen habe ich herausgefunden, dass die scheinbar beste Darstellung der Daten die Umwandlung in RS (Reed Solomon) Code ist.
    Den Algorithmus möchte ich aber in AutoIt schreiben, und hier sitzt mein Problem.

    Sämtliche bisher gefundenen C (ähnlichen) Algorithmen sagen mit überhaupt nix oder sind viel zu komplex.

    Daher die Frage: Gibt es eine übersichtliche Möglichkeit den Spaß in AutoIt zu implementieren ?

    lg
    M

  • Das hab ich mir auch mal angeschaut (Den QR Code) und hab auch etwas in AU3 gecodet, ist noch nicht viel und es wird noch nicht gezeichnet.
    http://martinstoev.de/public/article…ng/qrcode2.html
    http://www.thonky.com/qr-code-tutorial/part-1-encode-data/

    Die haben mir sehr geholfen!

    Mein bisheriger Code:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <GDIPlus.au3>
    #include <GDIP.au3>
    #include <Array.au3>

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

    ;; http://martinstoev.de/public/article…ng/qrcode2.html
    ;; die dunklen Module der binären 1 und die hellen Module der binären 0 entsprechen.
    ;; http://www.thonky.com/qr-code-tutorial/part-1-encode-data/

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

    Opt("GUIOnEventMode", 1)

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

    Global $nWidth = 21 * 4
    Global $nHeight = 21 * 4

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

    $hWnd = GUICreate("QR Code Creater", $nWidth, $nHeight)
    GUISetOnEvent(-3, "_Exit", $hWnd)
    GUISetState()

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

    $hDC = _WinAPI_GetDC($hWnd)
    $hDC_Buffer = _WinAPI_CreateCompatibleDC($hDC)
    $hGDI_Bitmap = _WinAPI_CreateCompatibleBitmap($hDC, $nWidth, $nHeight)
    _WinAPI_SelectObject($hDC_Buffer, $hGDI_Bitmap)
    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hDC_Buffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)

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

    $hQRBitmap = _CreateQRBitmap("HELLO WORLD")

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

    While Sleep(20)
    _GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF)

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

    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hQRBitmap, 0, 0, $nWidth, $nHeight)

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

    _WinAPI_BitBlt($hDC, 0, 0, $nWidth, $nHeight, $hDC_Buffer, 0, 0, 0x00CC0020)
    WEnd

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

    Func _CreateQRBitmap($sData, $Version = 1)
    ;; Aufbau: Mode Indicator +CCI + Daten + Terminator + Füllbits
    Local $hBitmap, $hBackbuffer ;; GDI
    Local $BinaryString = "";; Mode Indicator +CCI + Daten + Terminator + Füllbits
    Local $ModeIndicator ;; Mode Indicator
    Local $BitMAXLength, $CCI ;; Max. Length of Data typ|||Character Count Identifier
    Local $Daten ;; Was wohl
    Local $Terminator ;; Terminator (Eig immer Mode 0000)
    ;; Füllbits-> die letzten 0len bis isInt (AUFBAU/8)

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

    $hBitmap = _GDIPlus_BitmapCreateFromScan0(20, 20, 0, $GDIP_PXF32ARGB)
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    #region Generating binary string
    ;; Mode Indicator
    ; -> Numeric MODE: 0001
    If Not StringRegExp($sData, "[a-zA-Z]") Then
    MsgBox(0, "", "Numeric")
    $ModeIndicator = "0001"

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

    ; -> Alphanumeric MODE: 0010
    ElseIf StringRegExp($sData, "[a-zA-Z]") Then
    MsgBox(0, "", "Alphanumeric")
    $ModeIndicator = "0010"

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

    ; -> Binary Mode MODE: 0100
    ElseIf IsBinary($sData) Then ;; Unschön ....
    MsgBox(0, "", "Binary")
    $ModeIndicator = "0100"

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

    ; -> Japanese Mode MODE: 100

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

    EndIf

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

    $BinaryString &= $ModeIndicator

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

    ;; ###Ecode the Length of the Data###
    ;; Bis jetzt nur Version 1 (21x21)
    Switch $Version
    Case 1 ;; Version 1 (21x21 Felder/Module)
    Switch $ModeIndicator
    Case "0001" ;; Wenn es Numeric ist
    $BitMAXLength = 10
    $CCI = _TranslateBase(StringLen($sData), 10, 2) ;; Int in Binär
    _FillBinaryUntilMAX($CCI, $BitMAXLength)
    $BinaryString &= $CCI

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

    ;; Encode of Numeric: http://martinstoev.de/public/article…ng/qrcode3.html
    Case "0010" ;; Wenn es Alphanumeric ist
    $BitMAXLength = 9
    $CCI = _TranslateBase(StringLen($sData), 10, 2) ;; Int in Binär
    _FillBinaryUntilMAX($CCI, $BitMAXLength)
    $BinaryString &= $CCI
    ;; ###Encode the data###
    ;; Typspezific Ecode
    ;; Alphanumeric ->
    #cs
    To encode our alphanumeric data, we break up the string into pairs of characters: HE,LL,O ,WO,RL,D.
    For each pair of characters, we take the ASCII value of the first character and multiply it by 45. Then we add that number to the ASCII value of the second character. Then we convert the result into an 11-bit binary string. Refer to the table of alphanumeric values to get the ASCII value of each alphanumeric character.
    If you are encoding an odd number of characters, as we are here, take the ASCII value of the final character and convert it into a 6-bit binary string.
    As a side note, keep in mind that for the other modes (numeric, binary, and Japanese,) we would use a different method to encode the data. The method that I explained above is only for alphanumeric mode. Later, I will add information about how to encode data in other modes.
    QUELLE: http://www.thonky.com/qr-code-tutorial/part-1-encode-data/ || Datum: 03.01.2012
    #ce
    _EncodeTheData_Alphanumeric($sData, $BinaryString)

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

    Case "0100" ;; Wenn es Binary Mode ist
    $BitMAXLength = 8
    $CCI = _TranslateBase(StringLen($sData), 10, 2) ;; Int in Binär
    _FillBinaryUntilMAX($CCI, $BitMAXLength)
    $BinaryString &= $CCI
    Case "1000" ;; Wenn es Japanese Mode ist
    $BitMAXLength = 8
    $CCI = _TranslateBase(StringLen($sData), 10, 2) ;; Int in Binär
    _FillBinaryUntilMAX($CCI, $BitMAXLength)
    $BinaryString &= $CCI
    EndSwitch
    EndSwitch

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

    ;; ###Terminate## (Nach http://www.denso-wave.com/qrcode/vertable1-e.html -> Version1, ECC Level Q = 104!
    If StringLen($BinaryString) + 4 <= 104 Then ;; Wenn <= als 104 dann 4 0len dranhängen (Wenn die 4 0len dadurch die Größe von 104 überschreitetn : Weniger 0len (z.B. 3 bei 101)
    $BinaryString &= "0000" ;; Terminate
    ElseIf StringLen($BinaryString) + 4 > 104 Then
    If 104 - StringLen($BinaryString) > 0 Then
    Switch 104 - StringLen($BinaryString)
    Case 1
    $BinaryString &= "0"
    Case 2
    $BinaryString &= "00"
    Case 3
    $BinaryString &= "000"
    EndSwitch

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

    EndIf
    EndIf

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

    ;; ###Delimit the string into 8-bit words, then pad with 0s if necessary###
    ;; Einteilen nicht nötig (Wir gucken nur ob es durch 8 Teilbar ist, den Rest hängen wir dran)
    If Mod(StringLen($BinaryString), 8) = 0 Then ;; Wenns durch 8 Teilbar ist
    ;; NIX
    Else
    For $i = 7 To Mod(StringLen($BinaryString), 8) Step -1
    $BinaryString &= "0"
    Next
    EndIf

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

    ;; AUFGEFÜLLT!!

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

    ;; ###Add words at the end if the string is too short###
    ;; Wir müssen 104 / 8 = !13! 8Bit Blöcke (1 Byte) haben.
    ;; Temporär ablegen
    $tempBinaryString = $BinaryString
    If StringLen($BinaryString) / 8 < 104 / 8 Then
    For $i = (StringLen($tempBinaryString) / 8) + 1 To 104 / 8
    ;; Abwechselnd 11101100 und 00010001 zum füllen
    $tempi = $i - ((StringLen($tempBinaryString) / 8) + 1) ;; Um den durchlauf der Schleife zu bekommen
    If Mod($tempi, 2) = 0 Then;; Wenn gerade
    $BinaryString &= "11101100"
    Else
    $BinaryString &= "00010001"
    EndIf
    Next
    EndIf

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

    ;; Jetzt alles in 8Bit Packete umwandeln
    $aBinaryString = _BinarySplitInByte($BinaryString)

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

    _ArrayDisplay($aBinaryString)

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

    ;; FERTIG!!
    #endregion Generating binary string

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

    #region Generating Error Correction Code Words
    ;; ###Find out how many error correction code words you need to generate###
    ;; Nach der Error correction Tabelle benutzen wir bei Version 1, error correction Level Q, 13 Datenblöcke (Die wir auch im ersten Schritt erstellt haben (104/8)
    ;; ###Create your message polynomial###
    ;; Die 13 Byte Blöcke in Dezimal umwandeln
    Dim $aDec[UBound($aBinaryString)]
    For $i = 0 To UBound($aDec) - 1
    $aDec[$i] = _TranslateBase($aBinaryString[$i], 2, 10)
    Next

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

    ;; Term zum erstellen (Beispiel: 32x25 + 91x24 + 11x23 + 120x22 + 209x21 + 114x20 + 220x19 + 77x18 + 67x17 + 64x16 + 236x15 + 17x14 + 236x13
    ;; Erste Potenz wird gebildet: (number of data blocks) + (number of error correction code words) - 1

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

    _ArrayDisplay($aDec)

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

    #endregion Generating Error Correction Code Words

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

    _GDIPlus_GraphicsDrawRect($hBackbuffer, 0, 0, 10, 10)
    Return $hBitmap
    EndFunc ;==>_CreateQRBitmap

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

    Func _BinarySplitInByte($Binary)
    Dim $aTempBinary[StringLen($Binary) / 8] ;; Array mit dem benötigten Speicher
    For $i = 1 To StringLen($Binary) / 8 ;; Die Runden (Auch Anzahl der 8er Blöcke/Bytes)
    $aTempBinary[$i - 1] = StringLeft($Binary, 8) ;; $i-1 weil $i nicht 0 basierend ist
    $Binary = StringTrimLeft($Binary, 8)
    Next
    Return $aTempBinary
    EndFunc ;==>_BinarySplitInByte

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

    Func _EncodeTheData_Alphanumeric($sData, ByRef $sBinaryString)
    ;; Array mit den benötigten Char Werten
    Dim $aChar[45] = _ ;; http://www.thonky.com/qr-code-tutorial/alphanumeric-table/ !!!!
    ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", _ ;; Zahlen
    "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", _ ;; Alphabet
    " ", "$", "%", "*", "+", "-", ".", "/", ":"] ;; Sonderzeichen
    $aData = StringSplit($sData, "", 2)
    Dim $aCharvalue[UBound($aData)] ;; Array in dem die Werte der Chars stehen
    For $i = 0 To UBound($aData) - 1
    For $j = 0 To UBound($aChar) - 1
    If $aData[$i] = $aChar[$j] Then ;; Wenn Char übereinstimmen
    $aCharvalue[$i] = $j ;; Setzt den Wert des Chars (Value)
    ContinueLoop
    EndIf
    Next
    Next

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

    ;; Bits setzen!!
    For $i = 0 To UBound($aCharvalue) - 1 Step 2 ;; Bei ungraden Zahlen muss der Letzte Buchstabe auch mit einbezogen werden! (Als 6 Bit)
    If $i + 1 < UBound($aCharvalue) Then ;; Damits bei einem nicht hängen bleibt ;)
    $sBinary = _TranslateBase(($aCharvalue[$i] * 45) + $aCharvalue[$i + 1], 10, 2) ;; Integer Wert wieder in Binärcode umwandeln
    _FillBinaryUntilMAX($sBinary, 11) ;; 11 Bit Binary String
    $sBinaryString &= $sBinary
    EndIf
    If $i + 1 >= UBound($aCharvalue) Then ;; Wenn letzter Buchstabe (Einzeln)
    $sBinary = _TranslateBase($aCharvalue[$i], 10, 2) ;; Integer Wert wieder in Binärcode umwandeln
    _FillBinaryUntilMAX($sBinary, 6) ;; 6 Bit Binary String
    $sBinaryString &= $sBinary
    EndIf
    Next

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

    EndFunc ;==>_EncodeTheData_Alphanumeric

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

    Func _FillBinaryUntilMAX(ByRef $Binary, $BitMAXLength)
    If StringLen($Binary) < $BitMAXLength Then
    For $i = 1 To $BitMAXLength - StringLen($Binary)
    $Binary = "0" & $Binary
    Next
    ElseIf StringLen($Binary) > $BitMAXLength Then
    Return SetError(1, 1)
    EndIf
    EndFunc ;==>_FillBinaryUntilMAX

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

    Func _TranslateBase($sNumber, $iOldBase = 10, $iNewBase = 2)
    ;!!by eukalyptus!!
    If $iOldBase < 2 Or $iOldBase > 36 Or $iNewBase < 2 Or $iNewBase > 36 Then Return SetError(1, 1, False)
    Local $iNum, $aRes, $tChr = DllStructCreate("char[64];")
    If $iOldBase <> 10 Then
    $aRes = DllCall("msvcrt.dll", "uint64:cdecl", "_strtoui64", "str", $sNumber, "ptr", 0, "int", $iOldBase)
    If @error Then Return SetError(1, 2, False)
    $iNum = $aRes[0]
    Else
    $iNum = Int($sNumber)
    EndIf
    $aRes = DllCall("msvcrt.dll", "ptr:cdecl", "_i64toa", "int64", $iNum, "ptr", DllStructGetPtr($tChr), "int", $iNewBase)
    If @error Then Return SetError(1, 3, False)
    Return DllStructGetData($tChr, 1)
    EndFunc ;==>_TranslateBase

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

    Func _Exit()
    ;; WinApi
    _WinAPI_ReleaseDC($hWnd, $hDC)
    _WinAPI_DeleteDC($hDC_Buffer)
    _WinAPI_DeleteObject($hGDI_Bitmap)

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

    ;; GDI+
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_BitmapDispose($hQRBitmap)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

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

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • So etwas ähnliches möchte ich auch mal basteln. Allerdings fehlt mir dazu die Möglichkeit das ganze Fehlertolerant zu gestalten.
    Wenn man die Grafiken mit dem PC verschickt ist das nicht nötig, aber sobald man schon ein jpg-Bild nutzt, oder womöglich noch den eigentlichen Verwendungszweck, das fotografieren mit einem Handy praktizieren will, kommt man so nicht weit.


    Der QR-Code ist zumindest insofern fehlertolerant, dass pro Bit mehrere Pixel verwendet werden, beim Abfotografieren hat man wieder mehrere Pixel pro Bit.


  • Der QR-Code ist zumindest insofern fehlertolerant, dass pro Bit mehrere Pixel verwendet werden, beim Abfotografieren hat man wieder mehrere Pixel pro Bit.

    Das stimmt. Wenn man den Code im Bild findet und anschließend ein Gitter darüberlegt kann man jeweils den Mittelwert aller pixel pro "kästchen" bilden. Diese Mittelwerte setzt man in Relation zu den benachbarten Mittelwerten (so kann man auch über bzw unterbelichtete Bilder richtig zuordnen) und kann damit flächendeckend Fehler vermeiden. Das hilft aber nur bei kontinuierlichem Rauschen. Ist auf dem Code irgendwo ein Fleck, oder ist Dreck auf der Linse oder Irgendwas anderes hindert die Kamera jedes "kästchen" zu erfassen, so ist der Code aufgrund der Kompression nichtmal teilweise verwendbar. (unkomprimiert würden so nur einzelne Buchstaben/Wörter kaputt gehen. Was eine internetadresse z.B. aber schon zerstört).

    Daher wird eine Methode zur Wiederherstellung zwingend nötig. Und da habe ich nachgeforscht. Der RS-Code scheint dafür am effektivsten zu sein. Zur Not könnte man auch einen leichter zu programmierenden nutzen, um aber dann an die gleiche Wiederherstellungsrate zu kommen muss der Code viel länger werden, was sich negativ auf die Maße auswirkt.

    Ich schau mir mal die Links von BB an. Mal schauen, ob ich mit meinem beschränkten Mathematischen Wissen da durch blicke. Mathe LK 13, aber nix nützliches gelernt^^

    lg
    M

    //Edit:
    Habe mich nochmal nach Alternativen umgesehen. Dabei ist mir Interleaving aufgefallen, da es ein entscheidendes Problem beseitigen müsste. Und zwar Burstfehler (Fachbegriff :D).
    Ich möchte ja keinen QR-Code nachbauen, sondern einen ganz eigenen Code entwickeln (im Prinzip möchte ich etwas rundes mit schönen Flächen usw. Mal schauen wie man in geometrischen Formen Daten verpacken kann).

    Durch Interleaving würden Fehlergruppen aufgeteilt werden, sodass im Regelfall trotz dicker Flecken nur Einzelbitfehler auftauchen dürften. Diese kann man mit einfacheren Verfahren gut beseitigen.

    Ich habe nun eine Funktion gebastelt, die einen Text per Interleaving neu ordnet. Leider traue ich meiner Programmierkunst nicht zu 100%. Denn nur, weil man keinen Fehler gefunden hat heißt das nicht, dass keiner da ist ;)

    Daher bitte ich jemanden der evtl eine Referenzfunktion hat mal drüberzuschauen.
    Wenn das Verpacken schonmal klappt kann ich mich ans Entpacken machen. (vorher mache ich nix. Das ist nachher vergebene Liebesmüh^^)

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    ; s = String
    ; i = Interleaving Faktor

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

    Local $t, $s = 'aaaabbbbccccddddeeeeffffgggg', $i = 7, $r
    $t = TimerInit()
    $r = _Interleaving_Encode($s, $i)
    $t = TimerDiff($t)

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

    ConsoleWrite('String: ' & $s & @CRLF & 'Interl: ' & $r & @CRLF & 'Time : ' & Round($t, 2) & ' ms' & @CRLF)

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

    Func _Interleaving_Encode($s, $i)

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

    If $i = 0 Or Not IsInt($i) Then Return 'i muss einen Integerwert haben !'

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

    Local $l = StringLen($s), $a = _Split($s, $i), $m = _Maxlen($a), $r, $u = UBound($a)

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

    If Not $m Then Return 'es ist ein Fehler aufgetreten... a ist kein Array !'

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

    For $e = 1 To $m Step 1
    For $o = 0 To $u - 1 Step 1
    $r &= StringMid($a[$o], $e, 1)
    Next
    Next

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

    Return $r

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

    EndFunc

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

    Func _Maxlen($a) ; ermittelt die maximale Länge eines Strings im gegebenen Array
    If Not IsArray($a) Then Return
    Local $l = StringLen($a[0])
    For $i = 0 To UBound($a) - 1 Step 1
    If StringLen($a[$i]) > $l Then $l = StringLen($a[$i])
    Next
    Return $l
    EndFunc

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

    Func _Split($s, $i, $a = 0) ; s = String der zerteilt werden soll, i = Anzahl Teile | ret: Array mit geteiltem String

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

    Local $l = StringLen($s) ; Stringlänge des Inputstrings
    $i -= Int($i / $l - 0.1) * $l ; wenn $i zu groß ist wird es erniedrigt. Es wird IMMER abgerundet, daher Int(bla -0.1)
    Local $z = Ceiling($l / $i) ; Länge die links abgetrennt wird.

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

    If Not IsArray($a) Then
    Local $b[1] = [StringLeft($s, $z)]
    $a = $b
    Else
    Local $u = UBound($a)
    ReDim $a[$u + 1]
    $a[$u] = StringLeft($s, $z)
    EndIf

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

    If $i = 1 Then Return $a
    $a = _Split(StringTrimLeft($s, $z), $i - 1, $a)

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

    Return $a

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

    EndFunc

    [/autoit]

    lg
    M

    • Offizieller Beitrag

    Ich wollte schonmal den QR-Code in AutoIt abbilden und war auf der Suche nach der Spezifikation des QR-Codes. Habe dort aber nur rudimentäre Angaben gefunden. Das ist zwar alles verfügbar aber liegt z.B. in einer Normensammlung begraben, die man für "lausige" 300 Euronen erhalten kann. Deshalb habe ich nicht weiter gebastelt.
    Aber die Infos, die man so erhalten konnte, sagen zumindest aus, dass der QR-Code eine extrem hohe Fehlertoleranz aufweisen kann. Das kann man beim Erstellen festlegen, begrenzt dadurch dann die Anzahl zu speichernder Informationen. Man kann aber von einem QR-Code höchster Fehlertoleranz an beliebiger Stelle ca. 1/3 des Musters entfernen (Verschmutzen, Abreißen etc.) ohne Informationsverlust zu haben. Das fand ich recht überzeugend.

  • Jop. In der höchsten Einstellung packt man bis zu 30%.

    Ähnlich viel möchte ich auch erreichen, wobei dadurch bei den mir möglichen Verfahren die Codelänge auf ca. 300% steigen würde. (um beliebige 30% wieder herstellen zu können). Der QR Code ist bei 30% aber nicht 3Mal größer als der Ursprungscode. Deshalb brauche ich ein "relativ" effektives Fehlerkorrekturverfahren.

    RS habe ich mir abgeschminkt, da ich trotz intensiver Suche nirgens eine ordentliche Anleitung mit ausführlichen Beispielen finde.
    Auf Wikipedia bei der Fehlerkorrekturseite ist z.B. die Fehlerkorrektur mittels Hamming Distanz erläutert. Ganz ohne unverständliche komische Begriffe, sondern einfach und simpel. So wie es ein einfältiger Programmierer braucht.

    Mir würde auch eine Dll (die man includen kann) reichen, die die RS-Berechnung durchführt. Ansonsten wird kein RS genutzt. Das scheint ja wirklich kompliziert zu sein...

    Der von mir Entworfene Grafische Code soll "schön" anzusehen sein. Kein hässliches Viereck mit dicken Markierungen, damit es gelesen werden kann.
    Ich dachte an sowas: Klick Mich

    lg
    M