【问题标题】:I Want Convert Hex to Ascii我想将十六进制转换为ASCII
【发布时间】:2017-10-13 05:06:29
【问题描述】:

我想将十六进制转换为ASCII。

我尝试了不同的两种方法。但我没能成功。

方法一:

 public void ConvertHex(String hexString)
    {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < hexString.Length; i += 2)
        {
            String hs = hexString.Substring(i, i + 2);
            System.Convert.ToChar(System.Convert.ToUInt32(hexString.Substring(0, 2), 16)).ToString();
        }
        String ascii = sb.ToString();
        StreamWriter wrt = new StreamWriter("D:\\denemeASCII.txt");
        wrt.Write(ascii);

    }

方法二:

 public string HEX2ASCII(string hex)
    {
        string res = String.Empty;
        for (int a = 0; a < hex.Length; a = a + 2)
        {
            string Char2Convert = hex.Substring(a, 2);
            int n = Convert.ToInt32(Char2Convert, 16);
            char c = (char)n;
            res += c.ToString();
        }
        return res;
    }

传入的错误消息:(

我该怎么办?

【问题讨论】:

  • 请粘贴代码而不是图片
  • 好的。我正在添加。
  • 您正在尝试将由数字 0 到 F 组成的十六进制数转换为 Int32。解析器会在遇到 A~F 数字之一时抛出异常,因为它们是字母。 Int32 解析器不知道它们实际上是十六进制数字。
  • 黑底白字图像是否应该与问题相关,还是纯粹是装饰性的?如果它是相关的,那么您可能想解释它显示的内容。它是您要解析的文本文件的内容吗?它是您试图模仿的十六进制转储的结果吗?无论哪种情况,“将十六进制转换为 ascii”都不是您想要的,因此该图像的存在很奇怪。

标签: c# hex ascii data-conversion


【解决方案1】:

您的输入中没有有效字符。 c# 中的字符是具有私有属性的两个字节类,该属性指示字符是一个字节还是两个字节。编码库方法(unicode、UTF6、UTF7、UTF8)通常会进行转换并设置私有属性。很难用您的输入来判断您是转换为一个字节还是两个字节,以及输入是大端还是小端。下面的代码转换为 byte[] 和 int16[]。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "0178 0000 0082 f000 0063 6500 00da 6400 00be 0000 00ff ffff ffff ffff ffd6 6600";
            ConvertHex(input);
        }
        static void ConvertHex(String hexString)
        {
            Int16[] hexArray = hexString.Split(new char[] {' '},StringSplitOptions.RemoveEmptyEntries)
                    .Select(x => Int16.Parse(x, NumberStyles.HexNumber)).ToArray();

            byte[] byteArray = hexArray.Select(x => new byte[] { (byte)((x >> 8) & 0xff), (byte)(x & 0xff) }).SelectMany(x => x).ToArray();

        }
    }
}

【讨论】:

  • int16[] hexArray = hexStri... 此代码给出错误。
  • 您的输入中必须有其他字符,例如“\n”。试试:new char[] {' ', '\t', '\r', '\n'}
  • 您发布的数据有效。如果您发布不良数据,我将有机会修改代码。
  • link我上传了文件,请帮帮我。
【解决方案2】:

您的“Method1”有一些机会被重写以工作。 (你的“Method2”是没有希望的。)

因此,在“方法 1”中,您执行 String hs = hexString.Substring( i, i + 2 ),然后您忘记了 hs 曾经存在过。 (编译器不应该给你一个警告吗?)然后你继续做System.Convert.ToChar( System.Convert.ToUInt32( hexString.Substring( 0, 2 ), 16 ) )hexString.Substring( 0, 2 ) 将总是选择hexString 的前两个字符,而不是i 指向的两个字符。您可能打算这样做:System.Convert.ToChar( System.Convert.ToUInt32( hs , 16) )

此外,您声明了StringBuilder sb;,但您从未向其中添加任何内容。同时,System.Convert.ToChar() 没有副作用;它返回一个值;如果您不对返回的值做任何事情,则返回的值将永远丢失。您可能打算将System.Convert.ToChar() 的结果添加到您的StringBuilder

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2016-09-27
    • 2011-11-21
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多