将包含C中的无符号字符指针的代码移植到C#

栏目: C · 发布时间: 5年前

内容简介:翻译自:https://stackoverflow.com/questions/15211609/porting-code-containing-unsigned-char-pointer-in-c-to-c-sharp

我在C中有这个代码,我需要移植到C#:

void CryptoBuffer(unsigned char *Buffer, unsigned short length)
{
    unsigned short i;
    for(i=0; i < length; i++)
    {
        *Buffer ^= 0xAA;
        *Buffer++ += 0xC9;
    }
}

我试过这个:

public void CryptoBuffer(byte[] buffer, int length)
{
    for(int i = 0; i < length; i++)
    {
        buffer[i] ^= 0xAA;
        buffer[i] += 0xC9;
    }
}

但结果与预期不符.

根据这个例子,这个:

A5 03 18 01...

应该成为这样的:

A5 6F 93 8B...

它还说第一个字节没有加密,所以这就是A5保持不变的原因.

编辑澄清:规范只是说你应该跳过第一个字节,它没有详细说明,所以我猜你只是将序列从位置1传递到最后一个位置跳过第一个字节.

但我对C#端口的结果是:

A5 72 7B 74...

这个端口是正确的还是我错过了什么?

编辑2:为了进一步澄清,这是一个封闭的协议,所以我不能详细说明,这就是为什么我提供了足够的信息来帮助我移植代码,C代码是给我的那个,那就是规范说它会做什么.

真正的问题是规范中的“0xAA”是错误的,这就是输出不是预期的原因.这里提供的C#代码和接受的答案毕竟是正确的.

让我们分开,我们,一步一步.

void CryptoBuffer(unsigned char *Buffer, unsigned short length)
{
    unsigned short i;
    for(i=0; i < length; i++)
    {
        *Buffer ^= 0xAA;
        *Buffer++ += 0xC9;
    }
}

无论其他一些评论如何,这就是你通常用C/C++做这些事情的方法.关于这段代码并没有什么特别之处,而且它并不过分复杂,但我认为将其分解以向您展示会发生什么是很好的.

注意事项:

> unsigned char与c#中的byte基本相同

>无符号长度的值介于0-65536之间. Int应该做的伎俩.

>缓冲区有一个后增量

>字节分配(= 0xC9)将溢出.如果它溢出则在这种情况下被截断为8位.

>缓冲区由ptr传递,因此调用方法中的指针将保持不变.

>这只是基本的C代码,没有C.假设人们不在此处使用运算符重载,这是非常安全的.

这里唯一的“困难”是缓冲区.细节可以在Sutter的“Exceptional C”一书中阅读,但是一个小例子也解释了这一点.幸运的是,我们有一个完美的例子供我们使用.上述代码的字面翻译是:

void CryptoBuffer(unsigned char *Buffer, unsigned short length)
{
    unsigned short i;
    for(i=0; i < length; i++)
    {
        *Buffer ^= 0xAA;
        unsigned char *tmp = Buffer;
        *tmp += 0xC9;
        Buffer = tmp + 1;
    }
}

在这种情况下,temp变量可以简单地解决,这导致我们:

void CryptoBuffer(unsigned char *Buffer, unsigned short length)
{
    unsigned short i;
    for(i=0; i < length; i++)
    {
        *Buffer ^= 0xAA;
        *Buffer += 0xC9;
        ++Buffer;
    }
}

现在将此代码更改为C#非常简单:

private void CryptoBuffer(byte[] Buffer, int length)
{
    for (int i=0; i<length; ++i) 
    {
        Buffer[i] = (byte)((Buffer[i] ^ 0xAA) + 0xC9);
    }
}

这基本上与您的移植代码相同.这意味着在未来的某个地方出现了其他问题……所以,让我们破解密码缓冲器吧?

如果我们假设没有使用第一个字节(如你所说)并且’0xAA’和/或’0xC9’是错误的,我们可以简单地尝试所有组合:

static void Main(string[] args)
{
    byte[] orig = new byte[] { 0x03, 0x18, 0x01 };
    byte[] target = new byte[] { 0x6F, 0x93, 0x8b };

    for (int i = 0; i < 256; ++i)
    {
        for (int j = 0; j < 256; ++j)
        {
            bool okay = true;
            for (int k = 0; okay && k < 3; ++k)
            {
                byte tmp = (byte)((orig[k] ^ i) + j);
                if (tmp != target[k]) { okay = false; break; }
            }
            if (okay)
            {
                Console.WriteLine("Solution for i={0} and j={1}", i, j);
            }
        }
    }
    Console.ReadLine();
}

我们去:oops没有解决方案.这意味着cryptobuffer没有做你认为它正在做的事情,或者这里缺少部分C代码. F.ex.他们真的将’Buffer’传递给CryptoBuffer方法还是之前更改了指针?

最后,我认为这里唯一的好答案是缺少解决这个问题的关键信息.

翻译自:https://stackoverflow.com/questions/15211609/porting-code-containing-unsigned-char-pointer-in-c-to-c-sharp


以上所述就是小编给大家介绍的《将包含C中的无符号字符指针的代码移植到C#》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

复杂性思考

复杂性思考

Allen B. Downey / 张龙 / 机械工业出版社 / 2013-5 / 49.00元

本书的灵感来源于无聊与迷恋的感觉:对常规的数据结构与算法介绍的无聊,对复杂系统的迷恋。数据结构的问题在于教师在教授这门课程的时候通常不会调动起学生的积极性;复杂性科学的问题在于学校通常不会教授这门课程。 2005年,我在欧林学院讲授了一门新课程,学生要阅读关于复杂性的主题,使用Python进行实验,并学习算法与数据结构。当我在2008年再次讲授这门课程时,我写了本书的初稿。 在2011......一起来看看 《复杂性思考》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具