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));