无法将整数转换为字节

3

我正在将一个Delphi应用程序转换为C#,然后遇到了这个:

alength:=1; //alength is a byte
aa:=astring //astring is a string parameter passed into the function containing all this

alength:=strtoint(copy(aa,2,length(aa)-1));

所以,copy从现有字符串的一部分创建一个字符串,字符串的第一个字符从索引1开始,而不是像其他语言一样从0开始。它使用以下格式: function copy ( Source : string; StartChar, Count : Integer ) : string; 然后是strtoint,它将string转换为int
对于我在 c# 中转换的那段代码,我有: alength = Convert.ToInt32(aa.Substring(1 ,aa.Length - 1)); 这给了我错误:Error 131 Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?)。 由于alength已经是字节类型,我认为我不需要强制转换它?

1
你可能会喜欢我关于将Pascal类型数组移植到.NET泛型的技巧。点击此处查看详细内容。 - undefined
4个回答

3

当你赋值一个字节时,你正在使用Convert.ToInt32()。应该改用Convert.ToByte()

更好的方法是改用TryParse,以避免字符串无效时出现异常:

byte alength;
bool success = Byte.TryParse(aa.SubString(1,aa.Length - 1), out alength);

如果解析成功,success 将为 true,否则为 false。 您可以根据转换是否成功来定义程序的流程:
byte alength;
if(Byte.TryParse(aa.SubString(1,aa.Length - 1), out alength))
{
   //Great success! continue program
}
else
{
   //Oops something went wrong! 
}

1

只需更改:

alength = Convert.ToInt32(aa.Substring(1 ,aa.Length - 1));

转化为

alength = Convert.ToByte(aa.Substring(1 ,aa.Length - 1));

但更重要的问题是:原始用途中aa字符串的值范围是什么?是0-255吗?如果是,那么您可以简单地使用ToByte,但如果不是,则应考虑使用其他数据类型。

像这样:

int alength = Convert.ToInt32(aa.Substring(1 ,aa.Length - 1)); //define as int

等等,我甚至没有看到代码的下一行int alength32 = alength;。所以将int转换为byte再转回int是多余的,我可以按照你说的那样做对吗? - undefined
1
啊,是的,如果最终目标是int类型,那么你可以立即使用我在答案中提到的alength32Convert.ToInt32。不要先从int转换为byte,然后再转换回int,这样做是多余的。 - undefined
谢谢,我感觉很蠢,我一直卡在那一行代码上,没有看到下一行,而下一行本来可以帮到我的。 - undefined
没问题。😉 常言道,“有时候,需要第三只眼睛来发现错误”。 - undefined

0

纯粹的转换也可以工作。

字节大约有255种组合,所以:

byte i = int_variable & 0x000000FF;

将完全控制转换。


不,Visual Studio显示“无法将源类型“int”转换为目标类型“byte””,或者在运行时出现异常“算术操作导致溢出”。 - undefined
必须是 byte i = (byte)(int_variable & 0x000000FF);,因为你的 & 操作结果是一个整数。也许是我的编译器设置强制我这样做。 - undefined
关于编译器设置来检查算术溢出/下溢的内容,请参考以下链接:http://rion.io/2013/04/27/enabling-underflow-and-overflow-checking-within-visual-studio/ - undefined

-2
可以使用0xFF,因为没有差别,而且0x000000FF等于0xFF。

1
你的评论与问题无关。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接