将十六进制文件从文件添加到List <byte>

时间:2015-06-16 10:36:33

标签: c# arrays hex byte

我正在尝试从包含字符串(十六进制)的文件中创建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)?

4 个答案:

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