C# Can';t将int转换为字节

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

我正在将一个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
。它使用以下格式:

函数副本(源:字符串;起始字符,计数:整数):字符串

然后是
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;