【问题标题】:Add hexadecimal from file to List<byte>将文件中的十六进制添加到 List<byte>
【发布时间】:2015-09-01 03:07:26
【问题描述】:

我正在尝试从包含 string (Hexadecimal) 的文件中创建 List&lt;byte&gt;。 定义是:

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 作为参数。 让事情变得如此复杂的原因是为什么当我在 myArray.Add(0xb8); 中添加 Int32myArray 时它不会给我任何错误。

我觉得应该是字节的形式!也许吧!

为什么它没有给出任何错误以及如何完成这种情况(我的意思是从字符串添加字节到 myArray )?

【问题讨论】:

  • the result is : System.Int32 !!!! 当然......一个数字。还能是什么?

标签: c# arrays hex byte


【解决方案1】:

这行得通:

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 隐式常量表达式转换:

如果常量表达式的值在目的地类型。

这是因为所有整数文字都是 (u)int(u)long,如 2.4.4.2 整数文字中所述。

给定0 &lt;= 0xb8 &lt;= 255,编译器允许隐式转换。

在您的情况下,由于explained by @usr 的原因,您需要进行显式转换:

myArray.Add((byte)Convert.ToInt32(Line, 16));

【讨论】:

    【解决方案2】:

    0xb8 是一个整数文字(如1234)。 "0xb8" 是一个字符串文字(如"x")。 C# 中没有十六进制文字。它是十六进制格式的 int 文字。这就解释了你在使用文字时遇到的麻烦。

    并非所有字符串解析函数都支持十六进制输入。见this for how to parse a hex string

    当解析函数为您提供int 并且您需要将其视为byte 时,您可以转换:(byte)myInt。这是安全的,因为可以保证解析后的值适合一个字节。

    在某些地方,如果您一直使用0xb8 等常量,编译器可以为您自动转换。由于您在实践中不会有这种情况(您正在解析文件),这种情况与最终代码无关。但这解释了为什么会这样。

    【讨论】:

    • 他的问题是编译器中有一些智能,因此编译器会将整数文字转换为正确的类型...
    • @xanatos 对。 很多 事情要在这里解释!对于初学者来说,这是一个令人惊讶的令人困惑的问题。
    【解决方案3】:

    您可以通过将值转换为 byte 来消除该编译器错误:

    myArray.Add((byte)Convert.ToInt32(Line));
    

    但是,当您运行该代码时,您会得到一个不同的错误:

    未处理的异常:System.FormatException:输入字符串不在 格式正确。

    那是因为Convert.ToInt32 方法不解析开箱即用的十六进制数字。

    在将字符串转换为数字时可以指定基数:

    myArray.Add((byte)Convert.ToInt32(Line, 16));
    

    【讨论】:

    • 或者您可以保存演员表并改用Convert.ToByte(Line, 16)...然后如果您碰巧提供了“0xF8C4”的Line,您可以捕获OverflowException,而不仅仅是悄悄地截断到 0xC4
    【解决方案4】:

    如何实现这种情况(我的意思是从字符串添加字节到 myArray )?

    List<byte> myArray = new List<byte>();
    string Line = "0xb8";
    myArray.Add(Convert.ToByte(Line, 16));
    

    为什么当我在 myArray.Add(0xb8) 中将 Int32 添加到 myArray 时它没有给我任何错误;

    编译器可以看到0xb8Byte的取值范围内

    myArray.Add(0xb8);  // ok
    myArray.Add(0xff);  // ok
    myArray.Add(0x100); // cannot convert from int to byte
    

    【讨论】:

      猜你喜欢
      • 2019-06-26
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2017-08-31
      • 2013-02-18
      • 2010-11-21
      相关资源
      最近更新 更多