我想将hex转换为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);
}
方法2:
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 :(得分:2)
您的“Method1”有一些机会被重写为工作。 (你的“方法2”毫无希望。)
因此,在“Method1”中,您执行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
。
答案 1 :(得分:0)
您的输入中没有有效字符。 c#中的字符是两个字节类,带有private属性,指示字符是一个还是两个字节。编码库方法(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();
}
}
}