首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用逐位移位操作比较字符串

使用逐位移位操作比较字符串
EN

Stack Overflow用户
提问于 2015-03-17 18:14:21
回答 1查看 1.2K关注 0票数 0

所以我对csharp并不熟悉,在这个程序中我似乎找不到逻辑上的错误,我学习的是位移位操作符,就像我对这些操作符是新的一样。我需要帮助跟踪代码中的一个错误。程序对输入字符串进行编码,并对编码的字符串after.After进行解码,我比较该字符串以查看它们是否为equal.They,但在比较它们时,我总是得到一个错误。这是我的代码:

代码语言:javascript
复制
 class Program
{
    static char[] transcode = new char[64];

    private static void prep()
    {
        for (int i = 0; i < transcode.Length; i++)
        {
            transcode[i] = (char)((int)'A' + i);

            if (i > 25 && i <= 51)
            {
                transcode[i] = (char)((int)transcode[i] + 6);

            }
            else if (i > 51)
            {
                transcode[i] = (char)((int)transcode[i] - 0x4b);
            }
        }

        transcode[transcode.Length - 3] = '+';
        transcode[transcode.Length - 2] = '/';
        transcode[transcode.Length - 1] = '=';

    }

    static void Main(string[] args)
    {
        prep();
        string test_string = "a";

        if (Convert.ToBoolean(String.Compare(test_string, decode(encode(test_string)))))
        {
            Console.WriteLine("Test succeeded");
        }
        else
        {
            Console.WriteLine("Test failed");
        }
    }


    private static string encode(string input)
    {

        int l = input.Length;
        int cb = (l / 3 + (Convert.ToBoolean(l % 3) ? 1 : 0)) * 4;// (0 +(1))*4  =4 
        char[] output = new char[cb];
        for (int i = 0; i < cb; i++)
        {
            output[i] = '=';
        }

        int c = 0;
        int reflex = 0;
        const int s = 0x3f;

        for (int j = 0; j < l; j++)
        {
            reflex <<= 8;
            reflex &= 0x00ffff00;
            reflex += input[j];
            int x = ((j % 3) + 1) * 2;

            int mask = s << x;
            while (mask >= s)
            {
                int pivot = (reflex & mask) >> x;
                output[c++] = transcode[pivot];
                char alpha = transcode[pivot];
                int invert = ~mask;
                reflex &= invert;
                mask >>= 6;
                x -= 6; //-4
            }
        }

        switch (l % 3)
        {
            case 1:
                reflex <<= 4; //16
                output[c++] = transcode[reflex];
                char at16 = transcode[16];
                // Console.WriteLine("Character at 16 is: " + at16);
                break;
            case 2:
                reflex <<= 2;
                output[c++] = transcode[reflex];
                break;
        }
        return new string(output);//final value is: YQ== (Encoded String.)
    }


    private static string decode(string input)//input is YQ== which has a length of 4
    {
        int l = input.Length;
        int cb = (l / 4 + ((Convert.ToBoolean(l % 4)) ? 1 : 0)) * 3 + 1; // (1 + (0))*4
        char[] output = new char[cb]; //4 in length      
        int c = 0;
        int bits = 0;
        int reflex = 0;
        for (int j = 0; j < l; j++)
        {
            reflex <<= 6;
            bits += 6;
            bool fTerminate = ('=' == input[j]);

            if (!fTerminate)
            {
                reflex += indexOf(input[j]);
                while (bits >= 8)
                {
                    int mask = 0x000000ff << (bits % 8);
                    output[c++] = (char)((reflex & mask) >> (bits % 8));    //convert issue cannot implicitly convert to proper data type.so will have to explicitly convert.
                    int invert = ~mask;
                    reflex &= invert;
                    bits -= 8;
                }
            }
            else
            {
                break;

            }
        }
        return new string(output);
    }

    private static int indexOf(char ch)
    {
        int index;
        for (index = 0; index < transcode.Length; index++)
            if (ch == transcode[index])
                break;
        return index;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-17 18:23:34

读取String.Compare的文档,然后读取Convert.ToBoolean的文档。特别注意两个字符串相等时String.Compare返回的值。然后与ToBoolean将该值转换为布尔值的方式进行比较

String.Compare是为排序字符串而设计的。当两个字符串相等时,它返回0ToBoolean将将该0转换为false。因此,当字符串相等时,if的计算结果为false,而不是true

一个简单的改变是:

代码语言:javascript
复制
if (String.Compare(test_string, decode(encode(test_string)))==0)
{
    Console.WriteLine("Test succeeded");
}
else
{
    Console.WriteLine("Test failed");
}

@Tom关于尾空的评论也适用,但String.Compare似乎忽略了它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29106730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档