如何将字节数组中的十六进制值作为解释的 ASCII 数字转换为整数?

how to convert a hex value from a byte array as an interpreted ASCII number into an integer?

我刚开始学习 C# 编程,并且 如标题所述,我正在寻找一种方法,将作为字节 [] 中的 ASCII 字符传递给我的数字转换为整数。我经常找到将 hex-byte 转换为 ASCII-char 或字符串的方法。我也找到了另一个方向,从一个字符中获取 hex-byte 。也许我仍然应该说我将值显示在文本框中以供控制。

举个例子:
十六进制代码:30 36 38 31

Ascii 字符串:(0) 6 8 1

整数 (dez) 应为:681

到目前为止,我已经尝试了各种方法。我在 Microsoft Visual Studio 网站上也找不到它。其实这个应该比较简单。很抱歉我缺少 C# 基础知识。

and this integer parsing answer 放在一起,我们得到以下内容:

// hex -> byte array -> string
var hexBytes = "30 36 38 31";
var bytes = hexBytes.Split(' ')
    .Select(hb => Convert.ToByte(hb, 16)) // converts string -> byte using base 16
    .ToArray();
var asciiStr = System.Text.Encoding.ASCII.GetString(bytes);

// parse string as integer
int x = 0;
if (Int32.TryParse(asciiStr, out x))
{
    Console.WriteLine(x); // write to console
}
else
{
    Console.WriteLine("{0} is not a valid integer.", asciiStr); // invalid number, write error to console
}

Try it online

问题的典型解决方案是 Linq 查询。我们应该

  1. Split 初始字符串转化为项
  2. Convert每一项都转为int,对待16进制。我们应该减去 '0' 因为我们没有数字本身而是它的 ascii 码.
  3. Aggregate项进入最终整数

代码:

using System.Linq;

... 

string source = "30 36 38 31";

int result = source
  .Split(' ')
  .Select(item => Convert.ToInt32(item, 16) - '0')
  .Aggregate((sum, item) => sum * 10 + item);

如果你想获得ascii string你可以

  1. Split 字符串
  2. Convert每一项变成char
  3. Join 字符返回字符串:

代码:

string source = "30 36 38 31";

string asciiString = string.Join(" ", source
  .Split(' ')
  .Select(item => (char)Convert.ToInt32(item, 16)));

将包含 ASCII 码的字节数组转换为整数:

byte[] data   = {0x30, 0x36, 0x38, 0x31};
string str    = Encoding.ASCII.GetString(data);
int    number = int.Parse(str);

Console.WriteLine(number); // Prints 681

将整数转换为包含 ASCII 码的 4 字节数组(当然只有当数字 <= 9999 时才有效):

int number = 681;
byte[] data = Encoding.ASCII.GetBytes(number.ToString("D4"));
// data[] now contains 30h, 36h, 38h, 31h

Console.WriteLine(string.Join(", ", data.Select(b => b.ToString("x"))));