我正在尝试从包含字符串(十六进制)的文件中创建List<byte>
。
定义是:
List<byte> myArray = new List<byte>();
如果我想直接添加我的信息,我会使用以下内容:
myArray.Add(0xb8);
注意:没有任何引用或双引号。
问题是我想从文件中做同样的事情!
现在我想知道0xb8
的类型是什么,所以我使用以下代码:
0xc3.GetType().ToString()
结果是:System.Int32 !!!!
但是当我从文件中读取字符串并使用这样的代码时,它会给我以下错误。
代码:
Line = "0xb8";
myArray.Add(Convert.ToInt32(Line));
错误:
Argument 1: cannot convert from 'int' to 'byte'
很清楚。因为myArray
的唯一重载只有byte
作为参数。
让我这么复杂的原因是,当我在Int32
中向myArray
添加myArray.Add(0xb8);
时,它没有给我任何错误。
我认为它应该是一种字节形式!也许!
为什么不给出任何错误以及如何完成这种情况(我的意思是将字符串从字符串添加到myArray)?
答案 0 :(得分:5)
这有效:
var list = new List<byte>();
byte byteValue = 0xb8;
list.Add(byteValue);
这不是(“无法从'int'转换为'byte'”):
var list = new List<byte>();
int byteValue = 0xb8;
list.Add(byteValue);
然而,在这两种情况下,0xb8
都被视为System.Int32
。那么为什么编译器允许在第一个例子中将int
隐式转换为byte
?
参见C#规范6.1.9隐式常量表达式转换:
int类型的常量表达式(第7.19节[包括文字])可以转换为sbyte,byte,short,ushort,uint或ulong类型,前提是constant-expression的值在目的地类型。
这是因为所有整数文字都是(u)int
或(u)long
,如2.4.4.2整数文字中所述。
给定0 <= 0xb8 <= 255
,编译器允许隐式转换。
在您的情况下,由于explained by @usr的原因,您需要进行明确的转换:
myArray.Add((byte)Convert.ToInt32(Line, 16));
答案 1 :(得分:4)
0xb8
是一个整数文字(如1234
)。 "0xb8"
是一个字符串文字(如"x"
)。在C#中没有hex文字这样的东西。它是十六进制格式的int literal。这就解释了你对文字的麻烦。
并非所有字符串解析函数都支持十六进制输入。请参阅this for how to parse a hex string。
当解析函数为您提供int
并且您需要将其视为byte
时,您可以投射:(byte)myInt
。这是安全的,因为保证解析的值适合一个字节。
在某些地方,如果您使用0xb8
之类的常量,编译器可以自动转换。由于您在实践中没有这个(您正在解析文件),因此该案例与最终代码无关。但这解释了为什么会起作用。
答案 2 :(得分:2)
如何完成这种情况(我的意思是从字符串添加字节到myArray)?
List<byte> myArray = new List<byte>();
string Line = "0xb8";
myArray.Add(Convert.ToByte(Line, 16));
为什么我在myArray.Add(0xb8)中向myArray添加Int32时没有给我任何错误;
编译器可以看到0xb8
位于Byte
值范围
myArray.Add(0xb8); // ok
myArray.Add(0xff); // ok
myArray.Add(0x100); // cannot convert from int to byte
答案 3 :(得分:2)
只需将值转换为byte
:
myArray.Add((byte)Convert.ToInt32(Line));
但是,当您运行该代码时,您将收到不同的错误:
未处理的异常:System.FormatException:输入字符串不在 格式正确。
这是因为Convert.ToInt32
方法无法解析开箱即用的十六进制数字。
您可以在将字符串转换为数字时指定基数:
myArray.Add((byte)Convert.ToInt32(Line, 16));