C# 如何将字节数组中的十六进制值作为解释的ASCII数转换为整数?
我只是从c#编程和 正如标题所描述的,我正在寻找一种方法,将作为字节[]中的ASCII字符传递给我的数字转换为整数。我经常找到将十六进制字节转换为ASCII字符或字符串的方法。我还找到另一个方向,从字符中获取十六进制字节。也许我仍然应该说,我有一个文本框中显示的控制值 例如:C# 如何将字节数组中的十六进制值作为解释的ASCII数转换为整数?,c#,integer,hex,ascii,C#,Integer,Hex,Ascii,我只是从c#编程和 正如标题所描述的,我正在寻找一种方法,将作为字节[]中的ASCII字符传递给我的数字转换为整数。我经常找到将十六进制字节转换为ASCII字符或字符串的方法。我还找到另一个方向,从字符中获取十六进制字节。也许我仍然应该说,我有一个文本框中显示的控制值 例如: 十六进制代码:30 36 38 31 Ascii字符串:(0)6 8 1 整数(dez)应为:681 到目前为止,我已经尝试了各种各样的事情。我在Microsoft Visual Studio网站上也找不到它。其实这应该是
十六进制代码: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查询。我们应该
将初始字符串拆分为项目
将每个项目转换为int,将项目视为十六进制。我们应该减去'0'
,因为我们没有数字本身,而是它的ascii码
将
项聚合为最终整数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);
string source = "30 36 38 31";
string asciiString = string.Join(" ", source
.Split(' ')
.Select(item => (char)Convert.ToInt32(item, 16)));
如果要获取ascii字符串
,可以
Split
字符串将每个项目转换为char
将字符连接回字符串:
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);
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字节数组(仅当数字为感谢您的快速帮助时才起作用。我尝试过,但我认为对字节[]的理解有误。事实上,hexByte必须以以下方式实现:byte[]hexBytes=[0x30,0x36,0x38,0x31];我使用StreamReader.ReadBytes()从TCPIP获得此字节[])。即使我将答案从byte[]类型更改为var,我也无法执行任何.Split操作。据我所知,在这种情况下,我不必这样做。我还尝试单独运行每个字节,但System.Text.Encoding.ASCII.GetString(…)不要接受一个字节。@MaximilianFröhlich
var
不会有什么区别,因为一旦编译它就会变成string
。var
是语法糖,编译器会在编译时计算出它实际上是什么类型。“System.Text.Encoding.ASCII.GetString(…)
不要接受一个字节。”-你为什么要一次只做一个字节?我的答案来自var asciiStr=System.Text.Encoding.ASCII.GetString(bytes);
向下,用hexBytes
替换bytes
:。最终造成误解的原因是你使用了“hex bytes”一词,这表明它是一个字符串
。字节数组是一个字节数组,不管你是用十六进制、八进制还是十进制初始化它。如果你用十六进制初始化它,没有什么特殊的存储。好的,我得到了它。我的问题是如何从TCPIP读取数据或如何分割数据。数据现在以字节数组的形式出现,可以与var as一起使用ciiStr=System.Text.Encoding.ASCII.GetString(hexBytes);已转换为字符串。但是,我仍然必须定义一个子字符串以删除值之前的“:”。非常感谢。请向我们展示您的尝试