如何将长文本分成字节C#

时间:2019-01-07 19:42:23

标签: c# binary hex byte ascii

我在编码方面确实是新手,但是我的问题是如何将代码“ 7900BD7400BD7500BD76A5FF”划分为“ 79 00 BD 74 00 BD 75 00 BD 76 A5 FF”。我的主要问题是将十六进制转换为ascii,但是我得到的任何解决方案都只能转换“短”表达式。也许有人可以给我一些建议?我会很感激

2 个答案:

答案 0 :(得分:0)

由于您似乎不太了解字符串处理,因此我将举一个示例,该示例不需要您一次学习太多内容:

string input = "7900BD7400BD7500BD76A5FF";
string output = string.Empty;
for(int i=0; i<input.Length; i+=2) // Go in steps of 2
{
    output += input[i];    // The first of 2 characters
    output += input[i+1];  // The second of 2 characters
    output += ' ';         // The space
}
Console.WriteLine(output);

请注意,此解决方案仅在第二个字符后插入空格。它不检查这些代码是否都是十六进制代码,也不检查其长度是否为2的倍数。它假定之前的任何代码都会生成有效的结果。您应该确保使用单元测试。

这种方法对于长字符串来说不是很有效(如果您有长文本,请了解StringBuilder)。


如果您遵循this advice for creating the hex data,那么立即插入空格当然会容易得多:

public static string ByteArrayToString(byte[] ba)
{
  StringBuilder hex = new StringBuilder(ba.Length * 2);
  foreach (byte b in ba)
    hex.AppendFormat("{0:X2} ", b);             // <-- I inserted a space in the format string
  return hex.ToString();
}

答案 1 :(得分:0)

更一般的解决方案:

static String SeparateBy(
    this string str, 
    string separator, 
    int groupLength)
{
    var buffer = new StringBuilder();

    for (var i = 0; i < str.Length; i++)
    {
        if (i % groupLength == 0)
        {
            buffer.Append(separator);
        }

        buffer.Append(str[i]);
    }

    return buffer.ToString();
}

您会这样称呼它:"7900BD7400BD7500BD76A5FF".SeparateBy(" ", 2)

在可能的情况下(如果相对容易的话),请尝试概括方法,以便可以更频繁地重用它们。当然,如果事情开始变得复杂化,泛化可能会导致自我挫败……知道何时或何时不进行泛化是一种技巧,您将逐渐掌握。