将Ada代码转换为C#
所以我需要帮助转换这个ada代码int c#,它基本上是一个校验和算法 艾达: 这就是我能想到的: C#: RotateLeft功能:将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
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