将Ada代码转换为C#

将Ada代码转换为C#,c#,translation,ada,checksum,C#,Translation,Ada,Checksum,所以我需要帮助转换这个ada代码int c#,它基本上是一个校验和算法 艾达: 这就是我能想到的: C#: RotateLeft功能: public static int RotateLeft(int value, ushort rotateCount, int dataSize) { return (value << rotateCount) | (value >> (dataSize - rotateCount)); } pu

所以我需要帮助转换这个ada代码int c#,它基本上是一个校验和算法

艾达:

这就是我能想到的:

C#:

RotateLeft功能:

    public static int RotateLeft(int value, ushort rotateCount, int dataSize)
    {
        return (value << rotateCount) | (value >> (dataSize - rotateCount));
    }
publicstaticintrotateleft(int值、ushortrotatecount、int数据大小)
{
返回(值>(数据大小-旋转计数));
}
但是,当比较ada和C#算法的校验和结果时,它们不匹配,因此我认为我的转换是不正确的,以前使用过ada的任何人都可以提供一些输入,这将非常有帮助


谢谢

问题似乎与C#有关,也许与您对ADA代码的解释无关。如果您真的像post所暗示的那样旋转一个16位无符号数字,那么您需要屏蔽结果整数值的上2个字节,以便它们不会对答案产生影响。在C#中将uint x投射到ushort将相当于x&0x0000FFFF

    public static ushort RotateLeft(ushort value, int count)
    {
        int left = value << count;
        int right = value >> (16 - count);
        return (ushort)(left | right);
    }
公共静态ushort RotateLeft(ushort值,int计数)
{
int left=值>(16-计数);
返回(ushort)(左|右);
}

这个答案是C语言的,因为我没有C编译器

作为有符号的
int
,以便右移位将符号位扩展到空空间;因此,在
(value>(dataSize-rotateCount))
中,右半部分(
(value>(dataSize-rotateCount))
需要屏蔽顶部位。我不知道你为什么需要
dataSize
,是不是
sizeof(value)

我认为更好的解决方案是使用
无符号
,这样右移会将零引入空出的空间

#include <stdio.h>

unsigned rotateLeft(unsigned value, int by) {
  const unsigned bits = sizeof(value) * 8;
  return (value << by) | (value >> (bits - by));
}

int main() {
  unsigned input = 0x52525252;
  unsigned result = input;
  printf("input:  %x\n", input);
  {
    int j;
    for (j = 0; j < 8; j++) {
      result = rotateLeft(result, 1);
      printf("result: %x\n", result);
    }
  }
  return 0;
}

rotateCount的值正确吗?(在这种情况下,它必须是1)您有一个
int值
(Int32),但您将其旋转了16。提供所有C#和Ada数据类型。@Henkholtman移位函数基于以下内容:xgc.com/manuals/m1750-Ada/m1750/x2733.htmlI请查看xor->
^
翻译没有问题;您的问题很可能与“向左旋转”功能有关。请向我们展示
左旋转1位的规格和主体,以及涉及的类型。如果您不能这样做,请向我们展示它对数据的作用(例如,如果您输入
16#52525252#
(Ada的说法是
0x52525252
))移位函数基于此:位0应该是最重要的位是的,这很好。如果您坚持使用无符号类型以避免Simon上面提到的问题(符号位的移位),并修复RotateLeft函数,那么您应该得到相同的答案。OP“public static int RotateLeft(int value,ushort rotateCount,int dataSize)”中的函数对于dataSize的所有值都无效,如果给它一个负数,它可能不会达到您期望的效果。这可能就是你的问题所在。我使用了你的RotateLeft函数,但是我从ADA算法得到的结果仍然与我用C#算法得到的结果不相比较,翻译对我来说还行,所以我不知道还有什么可能是错误的。我想你需要再发布一些代码
    public static ushort RotateLeft(ushort value, int count)
    {
        int left = value << count;
        int right = value >> (16 - count);
        return (ushort)(left | right);
    }
#include <stdio.h>

unsigned rotateLeft(unsigned value, int by) {
  const unsigned bits = sizeof(value) * 8;
  return (value << by) | (value >> (bits - by));
}

int main() {
  unsigned input = 0x52525252;
  unsigned result = input;
  printf("input:  %x\n", input);
  {
    int j;
    for (j = 0; j < 8; j++) {
      result = rotateLeft(result, 1);
      printf("result: %x\n", result);
    }
  }
  return 0;
}
input:  52525252
result: a4a4a4a4
result: 49494949
result: 92929292
result: 25252525
result: 4a4a4a4a
result: 94949494
result: 29292929
result: 52525252