【问题标题】:Convert ASCII to HEX keeping line breaks将 ASCII 转换为 HEX 保留换行符
【发布时间】:2013-02-28 14:49:19
【问题描述】:

好的,所以我正在制作一个 ASCII 到 HEX 转换器,它工作正常,但是当我插入换行符时,它会用这个字符替换它们 -> Ú


转这个

1
2
3

到这里

1Ú2Ú3

命令按钮下的代码

    private void asciiToHex_Click(object sender, EventArgs e)
    {
        HexConverter HexConvert =new HexConverter();
        string sData=textBox1.Text;
        textBox2.Text = HexConvert.StringToHexadecimal(sData);
    }

    private void hexToAscii_Click(object sender, EventArgs e)
    {
        HexConverter HexConvert = new HexConverter();
        string sData = textBox1.Text;
        textBox2.Text = HexConvert.HexadecimalToString(sData);
    }

HexConverter.cs下的代码

public class HexConverter
{
    public string HexadecimalToString(string Data)
    {
        string Data1 = "";
        string sData = "";

        while (Data.Length > 0)
        //first take two hex value using substring.
        //then  convert Hex value into ascii.
        //then convert ascii value into character.
        {
            Data1 = System.Convert.ToChar(System.Convert.ToUInt32(Data.Substring(0, 2), 16)).ToString();
            sData = sData + Data1;
            Data = Data.Substring(2, Data.Length - 2);
        }
        return sData;
    }
    public string StringToHexadecimal(string Data)
    {
        //first take each charcter using substring.
        //then  convert character into ascii.
        //then convert ascii value into Hex Format

        string sValue;
        string sHex = "";
        foreach (char c in Data.ToCharArray())
        {
            sValue = String.Format("{0:X}", Convert.ToUInt32(c));
            sHex = sHex + sValue;
        }
        return sHex;
    }
}  

有什么想法吗?

【问题讨论】:

  • 您需要保留换行符吗?如果是这样,最容易逐行处理输入并在之后加入它们。否则,其他答案将为您指明正确的方向。
  • 这实际上取决于您如何获取数据 - 如果它来自文件,那么直接读取行(例如使用 File.ReadAllLines)将是最简单的。对于通用解决方案,只需使用 str.Split(new[] {"\r\n"}, StringSplitOptions.None) 拆分字符串 - 这将为您提供一个数组;创建一个新数组或列表,将转换后的字符串放入其中,然后使用string.Join("\r\n", newArray) 将其与换行符一起构建。其实最好把"\r\n"换成Environment.NewLine...

标签: c# .net hex ascii


【解决方案1】:

你能做的最懒惰的事情就是在结果上做一个string.replace("Ú","\r\n")。除非有令人信服的理由不这样做,否则我会从这里开始。

否则,在您的 Char 循环中,查找 NewLine 字符并将其按原样添加到您的字符串中。

【讨论】:

  • -1,对不起。在不了解其根本原因的情况下绕过错误是灾难的根源。在 OP 的情况下,(s)他还没有注意到它,但是"abcd\tefgh\tijkl" 将产生一个更复杂和看起来更奇怪的结果,一个无法以你描述的方式被破解的结果。
  • 不关心 OP 未解决的问题和问题并不会使这成为黑客攻击。这能解决问题吗?是的,因此不是黑客攻击,也不是无效答案。
  • 不过,它并没有解决问题。它甚至没有识别问题,它只是试图隐藏问题并绕过它。 (而且我无法想象你认为“黑客”这个词是什么意思,你认为这不是一个。有时黑客是适当的,甚至是必要的,但它们仍然是黑客。)
  • 我们是在讨论回答问题还是生成生产质量代码?如果是前者,那么我的两个答案都是正确的;如果是后者,那么只有我的第二个答案是有效的。由于进行比较(IF 块)比转换不必要的字符两次所需的处理能力更少,这是页面上最不坏的解决方案之一。
  • 你的“答案”都没有回答这个问题,也没有产生生产质量的代码。如果你不这么认为,那我只能算我自己很幸运,因为我从来不用写你写的代码。
【解决方案2】:

代替

System.Convert.ToUInt32(hexString),使用

uint.Parse(hexString, System.Globalization.NumberStyles.AllowHexSpecifier);

MSDN 说"AllowHexSpecifier flag indicates that the string to be parsed is always interpreted as a hexadecimal value"

How to: Convert Between Hexadecimal Strings and Numeric Types

【讨论】:

    【解决方案3】:

    问题在于String.Format("{0:X}", Convert.ToUInt32(c)) 没有将其输出补零到两位数,因此\r\n 变为DA 而不是0D0A。你会遇到类似的问题,但更糟糕的是,\t(变为9 而不是09,这也会导致后续字符不对齐)。

    要将零填充到两位数,您可以使用X2 而不是裸X;或者,更一般地说,您可以使用 X<i>n</i> 将零填充到 n 位。 (见the "Standard Numeric Format Strings" page on MSDN。)

    【讨论】:

    • 作为参考,格式说明符是 'X2' - 但您也可以将 2 替换为其他数字以获得那么多的零填充。
    • @AlexPaven:谢谢!我会将其添加到答案中。
    • 理论很好的解释,问题的答案在哪里?尤其是在您将合法答案称为 hack 之后。没有发布代码要求,只是一个关于如何解决问题的问题。
    • @Mike_Matthews_II:哈哈。好吧,我现在添加了“问题的答案”。 :-)
    • @ruakh 您的解决方案仍然比我的答案中的第二个选项需要更多的过程,使其成为一个不太理想的解决方案(而且更像是一个黑客)。所以,告诉你吧,如果你这么不高兴,我会用去掉 -1 来换取你。
    猜你喜欢
    • 2015-10-30
    • 2019-09-13
    • 2015-08-12
    • 1970-01-01
    • 2011-09-06
    • 2011-02-12
    • 2014-09-05
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多