【问题标题】:How to divide long text into bytes c#如何将长文本分成字节c#
【发布时间】:2019-06-02 11:52:30
【问题描述】:

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

【问题讨论】:

  • 你的问题我不清楚。因此,您有一个字符串“7900BD7400BD7500BD76A5FF”,并且您希望以在每个字节的两个(十六进制)字符之间插入空格的字符串结尾。正确的?因为我对您谈论“将十六进制转换为ascii”感到困惑,但您似乎在询问(简单)字符串操作。因此,我不确定您要的是什么...
  • 如果你的字符串是奇数个字符怎么办?如果包含非十六进制字符怎么办?
  • 另一种方法是将原始字符串转换为字节数组(请参阅此处的最终 SO Q&A:stackoverflow.com/questions/311165/…),然后通过在每个八位字节 (也看到那个SO帖子)。这仅适用于有效的十六进制字符串(我假设这是您的约束之一)
  • BD FF 等不是 ASCII。但是你已经知道你从不使用 ASCII,对吗??????问题是:您使用的是哪种字符编码?

标签: c# binary hex byte ascii


【解决方案1】:

由于您似乎对字符串处理的知识并不多,所以我举一个不需要您一次学习太多东西的示例:

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();
}

【讨论】:

  • 使用string output = "";而不是string output = string.Empty;有什么原因吗?还是只是个人喜好?
  • 这应该使用 StringBuilder,而不是字符串连接。循环中的字符串连接通常是一种非常糟糕的代码气味。值得检查字符串的长度,如果是奇数,则在第一个字符后放置一个空格,然后在每两个字符后放置一个空格
  • 现在,我真的不知道 OP 要求什么,但如果这是 OP 要求的,那么使用像 Regex.Replace(input, "(..)(?!$)", "$1 "); 这样的正则表达式替换可以更简单地实现结果; -)
  • @Flydog57:我选择了这种简单的方法,因为OP似乎没有太多经验。 StringBuilder 的概念可能对他来说太过分了
  • @Symon: "" 只是在 LinqPad 中编码时减少了输入。我通常用 string.Empty 替换它。
【解决方案2】:

问题的更一般的解决方案:

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)

在可能的情况下,如果它相对容易,请尝试概括方法,以便更频繁地重用它们。当然,如果事情开始变得复杂,泛化可能会弄巧成拙……知道何时或何时不进行泛化是您将逐渐获得的技能。

【讨论】:

    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    相关资源
    最近更新 更多