private static byte xtime(byte Tm)
{
int p = Convert.ToInt32(Tm);
int p1 = (p >> 7);
int p2 = (p1 & 1);
int p3=(p2 * 0x1b);
int p4 = (p << 1);
int p5 = p4 ^ p3;
byte p6 = (Convert.ToByte(p5));
return p6;
}
当输出低于255时,此功能正常工作但否则会崩溃(溢出异常)。
例如如果Tm为163,则输出应为93 (我从使用unsigned char作为数据类型执行C lang中的相同代码获得此值)
有人可以建议一种让这个功能起作用的方法吗?
答案 0 :(得分:1)
问题是p4
将生成一个大于字节允许值的值。如果强制转换到byte
,它将截断更高的位:
var p4 = (byte)(p << 1);
答案 1 :(得分:1)
如果查看Convert.ToByte()文档,它产生的唯一例外实际上是
OverflowException
导致
代码中的值小于Byte.MinValue或大于Byte.MaxValue。
和p5
变为349
。
要解决此问题:
1)正如评论中提到的那样,对byte
类型进行操作并且不将其转换为int
2)在适当的时候施放到(byte)
。 cast truncates 并且不会生成异常。
所以你的最终代码可能看起来像这样(只是在没有对代码的语义进行争论的情况下进行处理):
byte p1 = (byte)(Tm >> 7);
byte p2 = (byte)(p1 & 1);
byte p3= (byte)(p2 * 0x1b);
byte p4 = (byte)(Tm << 1);
byte p5 = (byte)(p4 ^ p3);
byte p6 = p5;
和p6 = 93
根据需要。