C-Code Unitx to Unix Encoding



  • hallo,

    habe folgenden C-Code bei dem ich Probleme habe den zu verstehen, hoffentlich kann ihn mir jemand erklären.
    Was noch hilfreicher wäre wenn ihn mit jemand in C-Sharp übersetzen könnte.
    Damit könnte ich dann mehr anfangen...

    /***********************************************************************
    * Function Name: UuEncode
    *
    * Description: UU-Encodes binary data
    *
    * Arguments:
    * pSrc Pointer to the source data (binary)
    * pDst Pointer to the destination data (UU-Encoded data)
    * nSrcLen Length of the source buffer
    *
    * Returns
    * Number of bytes in the pDst array
    **********************************************************************/

    INT32U UuEncode(INT8U* pDst,const INT8U* pSrc,INT32U nSrcLen)
    {
    unsigned int nDstIndex;
    unsigned int nSrcIndex;
    nDstIndex = 0;
    nSrcIndex = 0;
    while(nSrcIndex < nSrcLen)
    {
    // Encode A
    pDst[nDstIndex++] = ((pSrc[nSrcIndex] >> 2) & 0x3F) + 0x20;
    pDst[nDstIndex] = (pSrc[nSrcIndex++] << 4) & 0x3F;
    if ( nSrcIndex >= nSrcLen )
    { // this is the last byte
    pDst[nDstIndex] += 0x20;
    nDstIndex++;
    break;
    }
    // Encode B
    pDst[nDstIndex] |= (pSrc[nSrcIndex] >> 4) & 0x3F;
    pDst[nDstIndex++] += 0x20;
    pDst[nDstIndex] = (pSrc[nSrcIndex++] << 2) & 0x3F;
    if ( nSrcIndex >= nSrcLen )
    { // this is the last byte
    pDst[nDstIndex] += 0x20;
    nDstIndex++;
    break;
    }
    // Encode C
    pDst[nDstIndex] |= (pSrc[nSrcIndex] >> 6) & 0x3F;
    pDst[nDstIndex++] += 0x20;
    pDst[nDstIndex] = (pSrc[nSrcIndex++] & 0x3F) + 0x20;
    nDstIndex++;
    }
    return nDstIndex;
    }
    

    Vielen Dank im Voraus...


  • Administrator

    djfresh schrieb:

    Was noch hilfreicher wäre wenn ihn mit jemand in C-Sharp übersetzen könnte.
    Damit könnte ich dann mehr anfangen...

    Bitte sehr:

    int UuEncode(byte[] dst, byte[] src) 
    { 
        int dstIndex = 0;
        int srcIndex = 0;
    
        while(srcIndex < src.Length)
        {
            // Encode A
            dst[dstIndex++] = ((src[srcIndex] >> 2) & 0x3F) + 0x20;
            dst[dstIndex] = (src[srcIndex++] << 4) & 0x3F;
    
            if(srcIndex >= src.Length)
            {
                // this is the last byte
                dst[dstIndex] += 0x20;
                dstIndex++;
                break;
            }
    
            // Encode B
            dst[dstIndex] |= (src[srcIndex] >> 4) & 0x3F;
            dst[dstIndex++] += 0x20;
            dst[dstIndex] = (src[srcIndex++] << 2) & 0x3F;
    
            if(srcIndex >= src.Length)
            {
                // this is the last byte
                dst[dstIndex] += 0x20;
                dstIndex++;
                break;
            }
    
            // Encode C
            dst[dstIndex] |= (src[srcIndex] >> 6) & 0x3F;
            dst[dstIndex++] += 0x20;
            dst[dstIndex] = (src[srcIndex++] & 0x3F) + 0x20;
            dstIndex++;
        }
    
        return dstIndex;
    }
    

    Sieht nicht viel anders aus 😃

    Grüssli



  • das funktioniert nicht ganz...
    der Debugger bringt folgende Fehlermeldung:

    Der Typ "int" kann nicht implizit in "byte" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)

    für z.B. folgende Zeile:

    ((pSrc[nSrcIndex] >> 2) & 0x3F) + 0x20;



  • Wie wäre es mit casten?



  • ok hab mal (byte)... hinten eingefügt...
    probier grad mal ob was vernünftiges rauskommt...



  • Vielleicht hilft dir der Wikipedia-Artikel beim Verständnis: http://en.wikipedia.org/wiki/Uuencoding



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum C (C89 und C99) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ok die Übersetzung funktioniert schonmal...

    nun kennt sich jemand mit UU Encoding aus?
    was fange ich mit dem zurückgegebenen integer an?

    Weil soviel ich weiss ist UU Encoding...die Umwandlung von Unicode zu ASCII (im binären Sinne)...



  • djfresh schrieb:

    ok die Übersetzung funktioniert schonmal...

    nun kennt sich jemand mit UU Encoding aus?
    was fange ich mit dem zurückgegebenen integer an?

    Weil soviel ich weiss ist UU Encoding...die Umwandlung von Unicode zu ASCII (im binären Sinne)...

    http://de.wikipedia.org/wiki/UUencode
    http://en.wikipedia.org/wiki/Uuencoding



  • Ja Danke ich habe deinen Link schon bemerkt...

    ich wollte nur wissen ob sich jemand soweit damit auskennt um mir zu schildern ob der oben gepostete Code auch wirklich etwas damit zu tun hat und warum ein integer zurückgegeben wird...


  • Administrator

    djfresh schrieb:

    ich wollte nur wissen ob sich jemand soweit damit auskennt um mir zu schildern ob der oben gepostete Code auch wirklich etwas damit zu tun hat und warum ein integer zurückgegeben wird...

    Die Rückgabe des Integers kommt daher, damit man weiss, bis wohin in dst geschrieben wurde. So kann man einen grösseren Puffer für dst übergeben, als für src verwendet wird. In C# würde man dies wahrscheinlich ein wenig anders machen, aber das ist ziemlich üblich in C.

    Grüssli



  • Ok meine Verwirrung hat ein Ende.
    Es handelt sich nicht ganz um Standard UU-Encoding...

    z.B. wenn man "Cat" eingibt kommt beim Standard Uu-Encoding
    laut wikipedia "#0V%T" raus.
    Das "#" Zeichen steht hierfür nach UuTabell für "03" also 3 Zeichen.

    Der Code den ich gepostet habe lässt diese Kennzeichung weg.
    Deshalb war ich verwirrt.

    D.h. der gepostete Code spukt für "Cat" = "0V%T" raus. 😃


Anmelden zum Antworten