我不是c的大师,我需要一些帮助。 我有这段代码:
{
private ushort InCounter;
private ushort OutCounter;
private byte[] cipherKey1 = new byte[256];
private byte[] cipherKey2 = new byte[256];
public AuthCipher()
{
byte baseKey = 157;
byte baseKey2 = 98;
for (int i = 0; i < 256; i++)
{
this.cipherKey1[i] = baseKey;
this.cipherKey2[i] = baseKey2;
baseKey = (15 + baseKey * 250) * baseKey + 19;
baseKey2 = (121 - baseKey2 * 92) * baseKey2 + 109;
}
this.InCounter = 0;
this.OutCounter = 0;
}
public unsafe void Encrypt(byte* src, int srcOffset, byte[] dst, int dstOffset, int length)
{
fixed (byte* pDst = &dst[dstOffset])
{
for (int i = srcOffset; i < srcOffset + length; i++)
{
pDst[i] = (src[i] ^ 171);
pDst[i] = (byte)(pDst[i] >> 4 | (int)pDst[i] << 4);
byte* expr_39 = pDst + i;
*expr_39 ^= this.cipherKey2[this.InCounter >> 8];
byte* expr_51 = pDst + i;
*expr_51 ^= this.cipherKey1[(int)(this.InCounter & 255)];
this.InCounter += 1;
}
}
}
public unsafe void Decrypt(byte[] src, int srcOffset, byte* dst, int dstOffset, int length)
{
fixed (byte* pSrc = &src[srcOffset])
{
for (int i = dstOffset; i < dstOffset + length; i++)
{
dst[i] = (pSrc[i] ^ 171);
dst[i] = (byte)((int)dst[i] << 4 | dst[i] >> 4);
byte* expr_35 = dst + i;
*expr_35 ^= this.cipherKey2[this.OutCounter >> 8];
byte* expr_4C = dst + i;
*expr_4C ^= this.cipherKey1[(int)(this.OutCounter & 255)];
this.OutCounter += 1;
}
}
}
}
弹出错误:
baseKey = (15 + baseKey * 250) * baseKey + 19;
baseKey2 = (121 - baseKey2 * 92) * baseKey2 + 109;
pDst[i] = (src[i] ^ 171);
dst[i] = (pSrc[i] ^ 171);
已经尝试过阅读这个问题的其他答案但没有运气。 如果任何人可以帮助我理解什么是错的可能我知道如何解决它:)
任何帮助将不胜感激。
答案 0 :(得分:4)
事实上,在C#(而不是C)中,byte
上的大多数操作的结果(矛盾的是,但它确实有意义)int
。这意味着您需要回退到byte
,但是您需要考虑舍入行为等应该是什么。一个天真的修复方法是:
baseKey = (byte)((15 + baseKey * 250) * baseKey + 19);
baseKey2 = (byte)((121 - baseKey2 * 92) * baseKey2 + 109);
...
pDst[i] = (byte)(src[i] ^ 171);
...
dst[i] = (byte)(pSrc[i] ^ 171);
但只有你可以验证这些。
答案 1 :(得分:3)
如果你确定结果在字节中,那么:
baseKey = Convert.ToByte((15 + baseKey * 250) * baseKey + 19);
baseKey2 = Convert.ToByte((121 - baseKey2 * 92) * baseKey2 + 109);
否则您需要将baseKey
和baseKey2
更改为int
Ranges如下:
字节:0到255
Int:-2,147,483,648至2,147,483,647
答案 2 :(得分:0)
您不能使用byte
来存储大于255的数字:
baseKey = (15 + baseKey * 250) * baseKey + 19;
baseKey2 = (121 - baseKey2 * 92) * baseKey2 + 109;
然后是您的baseKey > 255
,您已声明int
变量来存储该号码。
答案 3 :(得分:0)
中间计算使用某种int类型。此外,您的结果太大,无法以字节表示。问题是你不能这样拿东西。
一种解决方案是实际执行显式转换(使用强制转换运算符或Convert.ToByte函数)。