C# Can';t将int转换为字节
我正在将一个Delphi应用程序转换为C#,我遇到了以下问题:C# Can';t将int转换为字节,c#,int,substring,byte,delphi-7,C#,Int,Substring,Byte,Delphi 7,我正在将一个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
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
。它使用以下格式:
函数副本(源:字符串;起始字符,计数:整数):字符串代码>
然后是strotint
,它将字符串
转换为int
对于该位代码的c#转换,我有:
alength=Convert.ToInt32(aa.Substring(1,aa.Length-1))代码>
这给了我错误error 131无法隐式地将类型'int'转换为'byte'。存在显式转换(是否缺少转换?
既然alength
已经是byte类型,我想我不必强制转换它吗 分配字节时使用的是Convert.ToInt32()
。改用Convert.ToByte()
更好的方法是使用TryParse
来避免字符串无效时出现异常:
byte alength;
bool success = Byte.TryParse(aa.SubString(1,aa.Length - 1), out alength);
如果解析成功,成功
将为true,否则为false。
您可以根据转换是否成功定义程序流:
byte alength;
if(Byte.TryParse(aa.SubString(1,aa.Length - 1), out alength))
{
//Great success! continue program
}
else
{
//Oops something went wrong!
}
简单更改:
alength = Convert.ToInt32(aa.Substring(1 ,aa.Length - 1));
进入
但这里更重要的问题是:最初使用的aa字符串的值范围是多少?是0-255吗?如果是,则可以简单地使用ToByte
,但如果不是,则应考虑使用其他数据类型
大概是这样的:
int alength = Convert.ToInt32(aa.Substring(1 ,aa.Length - 1)); //define as int
纯铸造也可以工作
我相信字节的最大值约为255个组合,因此:
byte i = int_variable & 0x000000FF;
将被完全控制施放。可以使用0xFF,因为没有区别&0x000000FF==0xFF您可能会喜欢我的技巧。等等,我甚至没有看到下一行代码,即int-alength32=alength
所以int
到byte
再回到int
是多余的,我可以照你说的做,对吗?啊,是的,如果最终目标是int
。这意味着您可以立即使用alength32
并使用Convert.ToInt32
,正如我在回答中所说的那样。不要从int
更改为byte
,然后再更改为int
。这是多余的谢谢你,我觉得自己很愚蠢,我一直在看这一行,而没有费心去读下一行,这会有帮助的。没问题。;)正如人们常说的,“有时,它需要第三只眼睛来发现错误”不,VisualStudio说“无法将源类型“int”转换为目标类型“byte”`或者在运行时得到由溢出引起的异常算术运算必须是byte i=(byte)(int_变量&0x000000FF)代码>因为&-运算结果是整数。可能是我的编译器设置迫使我这样做。讨论:关于检查算术溢出/下溢的编译器设置:您的评论与问题无关。
byte i = int_variable & 0x000000FF;