【问题标题】:String to Binary in C#C#中的字符串转二进制
【发布时间】:2011-08-05 13:56:07
【问题描述】:

我有一个函数可以将字符串转换为十六进制,

public static string ConvertToHex(string asciiString)
{
    string hex = "";
    foreach (char c in asciiString)
    {
         int tmp = c;
         hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString()));
    }
    return hex;
}

您能帮我根据我的示例函数将另一个字符串写入二进制函数吗?

public static string ConvertToBin(string asciiString)
{
    string bin = "";
    foreach (char c in asciiString)
    {
        int tmp = c;
        bin += String.Format("{0:x2}", (uint)System.Convert.????(tmp.ToString()));
    }
    return bin;
}

【问题讨论】:

  • char => int => string => uint => uint(再次?)......哇!你把我弄丢了。
  • 您似乎认为是 ToUInt32 正在转换为十六进制,但实际上是 x2 格式化说明符到 String.Format。不幸的是,我认为没有 b8 格式说明符。
  • 可以实现ICustomFormatter,见MSDN link

标签: c# string binary types


【解决方案1】:

给你:

public static byte[] ConvertToByteArray(string str, Encoding encoding)
{
    return encoding.GetBytes(str);
}

public static String ToBinary(Byte[] data)
{
    return string.Join(" ", data.Select(byt => Convert.ToString(byt, 2).PadLeft(8, '0')));
}

// Use any sort of encoding you like. 
var binaryString = ToBinary(ConvertToByteArray("Welcome, World!", Encoding.ASCII));

【讨论】:

  • 请使用System.Text.UTF8Encoding
  • 他的例子说 asciiString 作为参数。我也不知道二进制数组应该是什么格式。但您可以根据需要更改编码。
  • @JSBangs OP 似乎确实想使用 ASCII。但你是对的,这不是原始代码的作用,它可能也不起作用。但是使用 UTF8 会有所不同。相当于 OP 的代码是使用Unicode
  • OP 使用了变量名“asciiString”,但这并没有改变字符串是 UTF-16 LE 的事实(因为这是 string 一直拥有的)。在我看来,使用非 Unicode 编码的唯一原因在于无法更改的遗留系统的薄接口层。即便如此,也只有在遗留系统可以被替换之前。现在 OP 可能会说 asciiString 中的字符仅限于 ASCII 范围(7 位值)。如果是这种情况,UTF-8 解决方案将与 ASCII 解决方案相同,因此无论如何都应该使用 UTF-8。
  • @JSBangs 是的,我完全同意这一点。我的评论更倾向于 UTF8 可能也是错误的,或者至少不是代码当前对任何代码点 > 127 所做的事情。
【解决方案2】:

听起来您基本上想将一个 ASCII 字符串,或者更优选地,一个 byte[](因为您可以使用您的首选编码模式将您的字符串编码为一个 byte[])转换为一个 1 和 0 的字符串?即101010010010100100100101001010010100101001010010101000010111101101010

这将为您做到这一点...

//Formats a byte[] into a binary string (010010010010100101010)
public string Format(byte[] data)
{
    //storage for the resulting string
    string result = string.Empty;
    //iterate through the byte[]
    foreach(byte value in data)
    {
        //storage for the individual byte
        string binarybyte = Convert.ToString(value, 2);
        //if the binarybyte is not 8 characters long, its not a proper result
        while(binarybyte.Length < 8)
        {
            //prepend the value with a 0
            binarybyte = "0" + binarybyte;
        }
        //append the binarybyte to the result
        result += binarybyte;
    }
    //return the result
    return result;
}

【讨论】:

    【解决方案3】:

    以下将为您提供每个字符的低字节的十六进制编码,看起来就像您要求的那样:

    StringBuilder sb = new StringBuilder();
    foreach (char c in asciiString)
    {
        uint i = (uint)c;
        sb.AppendFormat("{0:X2}", (i & 0xff));
    }
    return sb.ToString();
    

    【讨论】:

      【解决方案4】:

      这是一个扩展函数:

              public static string ToBinary(this string data, bool formatBits = false)
              {
                  char[] buffer = new char[(((data.Length * 8) + (formatBits ? (data.Length - 1) : 0)))];
                  int index = 0;
                  for (int i = 0; i < data.Length; i++)
                  {
                      string binary = Convert.ToString(data[i], 2).PadLeft(8, '0');
                      for (int j = 0; j < 8; j++)
                      {
                          buffer[index] = binary[j];
                          index++;
                      }
                      if (formatBits && i < (data.Length - 1))
                      {
                          buffer[index] = ' ';
                          index++;
                      }
                  }
                  return new string(buffer);
              }
      

      你可以像这样使用它:

      Console.WriteLine("Testing".ToBinary());
      

      如果你添加'true'作为参数,它会自动分隔每个二进制序列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        • 2017-02-23
        • 2014-08-03
        • 2010-09-25
        • 2014-06-14
        • 2017-03-22
        • 1970-01-01
        相关资源
        最近更新 更多