如何将字节数组中的十六进制值作为解释的 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
}
问题的典型解决方案是 Linq 查询。我们应该
Split
初始字符串转化为项
Convert
每一项都转为int,对待16进制。我们应该减去 '0'
因为我们没有数字本身而是它的 ascii 码.
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
你可以
Split
字符串
Convert
每一项变成char
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"))));
我刚开始学习 C# 编程,并且 如标题所述,我正在寻找一种方法,将作为字节 [] 中的 ASCII 字符传递给我的数字转换为整数。我经常找到将 hex-byte 转换为 ASCII-char 或字符串的方法。我也找到了另一个方向,从一个字符中获取 hex-byte 。也许我仍然应该说我将值显示在文本框中以供控制。
举个例子:
十六进制代码:30 36 38 31
Ascii 字符串:(0) 6 8 1
整数 (dez) 应为:681
到目前为止,我已经尝试了各种方法。我在 Microsoft Visual Studio 网站上也找不到它。其实这个应该比较简单。很抱歉我缺少 C# 基础知识。
将
// 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
}
问题的典型解决方案是 Linq 查询。我们应该
Split
初始字符串转化为项Convert
每一项都转为int,对待16进制。我们应该减去'0'
因为我们没有数字本身而是它的 ascii 码.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
你可以
Split
字符串Convert
每一项变成char
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"))));