【问题标题】:Adding Null Padding to UUEncoder in C在 C 中向 UUEncoder 添加空填充
【发布时间】:2015-01-31 10:11:23
【问题描述】:

我知道我即将完成这个 UUEncoder 函数;我将使用它与嵌入式设备进行通信。但是对于我的生活,我无法弄清楚如何在最后正确插入空填充字符。

我一直在尝试效仿here 的示例。

void encode(unsigned char fileData_Hex_String[], int hexDataCharCount)
{
    unsigned char UUE_Encoded_String[MAX_SIZE];
    unsigned char b[2];
    unsigned char d[3];
    int UUE_Encoded_String_Index = 0;

    hexDataCharCount =7;

    for(int hexDataIndex = 0;  hexDataIndex < hexDataCharCount; hexDataIndex)
    {
        // Load chars or nulls
        for (int i = 0; i < 3; ++i)
        {
            b[i] = fileData_Hex_String[hexDataIndex];
            printf("%i\n", (hexDataIndex - hexDataCharCount));
            if ((hexDataIndex - hexDataCharCount) > 0)
            {
                b[1] = '\n';
                b[2] = '\n';
                break;
            }
            hexDataIndex++;
        }


        // UUEncode
        d[0] = (((b[0] >> 2) & 0x3f) + ' ');
        d[1] = ((((b[0] << 4) | ((b[1] >> 4) & 0x0f)) & 0x3f) + ' ');
        d[2] = ((((b[1] << 2) | ((b[2] >> 6) & 0x03)) & 0x3f) + ' ');
        d[3] = ((b[2] & 0x3f) + ' ');

        // Put the UUEncoded chars into their own string.
        for (int i = 0; i < 4; i++)
        {
            UUE_Encoded_String[UUE_Encoded_String_Index] = d[i];
            printf(" 0x%2x \n", UUE_Encoded_String[UUE_Encoded_String_Index]);
            UUE_Encoded_String_Index++;
        }
    }
}

一切正常,除了最后 0x48 和 0x2A 有两个不需要的字符。

【问题讨论】:

    标签: c embedded uuencode


    【解决方案1】:

    您的数组太小。你已经声明了

    unsigned char b[2];
    unsigned char d[3];
    

    但索引都超出范围

    d[3] = ((b[2] & 0x3f) + ' ');
    

    所以你应该声明

    unsigned char b[3];
    unsigned char d[4];
    

    【讨论】:

    • 不确定我是否关注。 b[2] 用于十六进制值,d[3] 用于 UEE 值。 4 个 UUE 需要 3 个十六进制字符。
    • unsigned char b[2] 可以索引为b[0]b[1],但b[2] 超出范围,因为unsigned char b[2] 只有2 个元素。
    • 啊。是的,谢谢你。这将在以后避免我的心痛,但它仍然不能解决空填充的问题。
    【解决方案2】:

    \n 不是 null 它是换行符。如果你把

    b[1] = 0;
    b[2] = 0;
    

    最后两个字节是0x20 0x20。但是如果你这样写循环,你的代码会更灵活

    // Load chars or nulls
    for (i = 0; i < 3; ++i)
    {
        if (hexDataIndex < hexDataCharCount)
            b[i] = fileData_Hex_String[hexDataIndex];
        else
            b[i] = 0;
        hexDataIndex++;
    }
    

    【讨论】:

    • 谢谢你,我知道那些是愚蠢的错误。只是变得痴迷和睡眼惺忪。完美运行。
    【解决方案3】:

    Weather Vane 帮助我之后的工作代码。

    void encode2(unsigned char fileData_Hex_String[], int hexDataCharCount)
    {
        unsigned char UUE_Encoded_String[MAX_SIZE];
        unsigned char b[3];
        unsigned char d[4];
    
        int paddedIndex = 0;
        int UUE_Encoded_String_Index = 0;
    
        for(int hexDataIndex = 0;  hexDataIndex < hexDataCharCount; hexDataIndex)
        {   
            // Load chars or nulls
            for (int i = 0; i < 3; i++)
            {
    
                if (hexDataIndex < hexDataCharCount)
                {
                    b[i] = fileData_Hex_String[hexDataIndex];   
                }
                else
                {
                    b[i] = 0;
                    paddedIndex++;
                }
                //printf("%i\n", (hexDataIndex-hexDataCharCount));
                hexDataIndex++;
            }
    
            // UUEncode
            d[0] = (((b[0] >> 2) & 0x3f) + ' ');
            d[1] = ((((b[0] << 4) | ((b[1] >> 4) & 0x0f)) & 0x3f) + ' ');
            d[2] = ((((b[1] << 2) | ((b[2] >> 6) & 0x03)) & 0x3f) + ' ');
            d[3] = ((b[2] & 0x3f) + ' ');
    
            // Put the UUEncoded chars into their own string.
            for (int i = 0; i < 4; i++)
            {
                UUE_Encoded_String[UUE_Encoded_String_Index] = d[i];
                UUE_Encoded_String_Index++;
            }
            //printf("      %i      %i\n", hexDataIndex, hexDataCharCount);
    
        }
        printf("%i\n", (UUE_Encoded_String_Index-paddedIndex));
        for (int i = 0; i < (UUE_Encoded_String_Index-paddedIndex); ++i)
        {
            printf(" 0x%2x \n", UUE_Encoded_String[i]);
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-02-12
      • 2017-04-03
      • 2014-03-16
      • 2016-09-25
      • 2013-01-29
      • 2011-12-15
      • 2019-07-31
      • 1970-01-01
      相关资源
      最近更新 更多