C# 将十六进制从文件添加到列表<;字节>;
我试图从一个包含字符串(十六进制)的文件中创建一个C# 将十六进制从文件添加到列表<;字节>;,c#,arrays,hex,byte,C#,Arrays,Hex,Byte,我试图从一个包含字符串(十六进制)的文件中创建一个列表。 定义是: List<byte> myArray = new List<byte>(); 注:无任何报价或双报价 问题是当我想从文件中做同样的事情时! 现在我想知道0xb8的类型是什么,所以我使用以下代码: 0xc3.GetType().ToString() 结果是:System.Int32 但是,当我从文件中读取字符串并使用这样的代码时,它会给我以下错误 代码: Line = "0xb8"; myArray.
列表。
定义是:
List<byte> myArray = new List<byte>();
注:无任何报价或双报价
问题是当我想从文件中做同样的事情时!
现在我想知道0xb8
的类型是什么,所以我使用以下代码:
0xc3.GetType().ToString()
结果是:System.Int32
但是,当我从文件中读取字符串并使用这样的代码时,它会给我以下错误
代码:
Line = "0xb8";
myArray.Add(Convert.ToInt32(Line));
错误:
Argument 1: cannot convert from 'int' to 'byte'
这很清楚。因为myArray
的唯一重载只获取一个byte
作为argumat。
使事情变得如此复杂的是,为什么在myArray.add(0xb8)中将Int32
添加到myArray
时,它不会给我任何错误代码>
我认为它应该是字节的一种形式!也许吧
为什么它没有给出任何错误,以及如何实现这个场景(我的意思是将字节从字符串添加到myArray)
如何实现这个场景(我的意思是将字节从字符串添加到myArray)
0xb8
是一个整数文本(如1234
)“0xb8”
是字符串文字(如“x”
)。在C#中没有十六进制文字。它是十六进制格式的整型文字。这就解释了你在文字上遇到的麻烦
并非所有的字符串解析函数都支持十六进制输入。看
当解析函数给您一个int
并且您需要将其作为字节处理时,您可以强制转换:(byte)myInt
。这是安全的,因为解析后的值保证适合一个字节
在某些地方,如果您一直在使用常量,例如0xb8
,编译器可以为您自动转换。由于在实际中(您正在解析一个文件)不会出现这种情况,因此这种情况与最终代码无关。但这也解释了为什么这样做有效。这样做有效:
var list = new List<byte>();
byte byteValue = 0xb8;
list.Add(byteValue);
只需将值强制转换为字节
,即可消除该编译器错误:
myArray.Add((byte)Convert.ToInt32(Line));
但是,当您运行该代码时,将出现不同的错误:
未处理的异常:System.FormatException:输入字符串不在
格式正确
这是因为Convert.ToInt32
方法不会立即解析十六进制数字
将字符串转换为数字时,可以指定基数:
myArray.Add((byte)Convert.ToInt32(Line, 16));
他的问题是编译器中有一些智能,因此整型文字被编译器转换为正确的类型…@xanatos right。这里有很多东西要解释!对于初学者来说,这是一个令人惊讶的令人困惑的问题。或者你可以保存演员阵容并使用Convert.ToByte(第16行)
来代替…然后如果你碰巧提供了一个Line
的“0xF8C4”,你就可以捕捉到一个OverflowException
,而不是静静地截断到0xC4,结果是:System.Int32代码>当然。。。一个数字。还可能是什么?
var list = new List<byte>();
byte byteValue = 0xb8;
list.Add(byteValue);
var list = new List<byte>();
int byteValue = 0xb8;
list.Add(byteValue);
myArray.Add((byte)Convert.ToInt32(Line, 16));
myArray.Add((byte)Convert.ToInt32(Line));
myArray.Add((byte)Convert.ToInt32(Line, 16));