Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将字节数组中的十六进制值作为解释的ASCII数转换为整数?_C#_Integer_Hex_Ascii - Fatal编程技术网

C# 如何将字节数组中的十六进制值作为解释的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网站上也找不到它。其实这应该是

我只是从c#编程和 正如标题所描述的,我正在寻找一种方法,将作为字节[]中的ASCII字符传递给我的数字转换为整数。我经常找到将十六进制字节转换为ASCII字符或字符串的方法。我还找到另一个方向,从字符中获取十六进制字节。也许我仍然应该说,我有一个文本框中显示的控制值

例如:
十六进制代码: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);已转换为字符串。但是,我仍然必须定义一个子字符串以删除值之前的“:”。非常感谢。请向我们展示您的尝试