Строка для двоичных файлов в C #

19

У меня есть функция для преобразования строки в шестнадцатеричную,

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;
}
    
задан Nano HE 14.04.2011 в 15:57
источник
  • char => int => string => uint => uint (опять?) ... whoa! Ты потерял меня там. –  Konrad Rudolph 14.04.2011 в 15:59
  • Кажется, вы думаете, что это ToUInt32, который выполняет преобразование в шестнадцатеричный, но на самом деле это спецификатор форматирования x2 для String.Format. К сожалению, я не думаю, что есть спецификатор формата b8. –  Justin 14.04.2011 в 16:02
  • Вы можете реализовать ICustomFormatter, показанный в ссылке MSDN –  antonio 12.10.2016 в 08:54

4 ответа

34

Здесь вы идете:

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));
    
ответ дан Jaapjan 14.04.2011 в 16:00
источник
  • Пожалуйста, используйте System.Text.UTF8Encoding. –  JSBձոգչ 14.04.2011 в 16:03
  • В его примере указано как asciiString как параметр. Я также не знаю, какой формат должен иметь двоичный массив. Но вы можете изменить кодировку по требованию. –  Jaapjan 14.04.2011 в 16:04
  • @JSBangs OP, похоже, хочет использовать ASCII. Но вы правы, это не то, что делает оригинальный код, и это, вероятно, тоже не сработает. Но использование UTF8 делает что-то другое. Эквивалент коду OP будет использовать Unicode. –  Konrad Rudolph 14.04.2011 в 16:05
  • ОП использовало имя переменной «asciiString», но это не меняет того факта, что строка UTF-16 LE (потому что это то, что всегда имеет строка). По моему мнению, единственная причина когда-либо использовать кодировку, отличную от Юникода, находится в тонком интерфейсе для устаревшей системы, которая не может быть изменена. И даже тогда, только до тех пор, пока прежняя система не будет заменена. Теперь OP может сказать, что символы в asciiString ограничены диапазоном ASCII (7-битные значения). Если это так, решение UTF-8 будет идентично решению ASCII, поэтому UTF-8 следует использовать в любом случае. –  Jeffrey L Whitledge 14.04.2011 в 16:15
  • @ JSBangs Правильно, я полностью согласен с этим. Мой комментарий был больше в том смысле, что UTF8, вероятно, также ошибочен или, по крайней мере, не тот код, который сейчас выполняется для любого кодового номера> 127. –  Konrad Rudolph 14.04.2011 в 19:57
Показать остальные комментарии
9

Похоже, вы в основном хотите взять строку ASCII или, более предпочтительно, байт [] (так как вы можете закодировать свою строку в байт [], используя предпочтительный режим кодирования), в строку из них и нули? т.е. 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;
}
    
ответ дан series0ne 25.05.2012 в 11:49
источник
1

Ниже приведено шестнадцатеричное кодирование для младшего байта каждого символа, который выглядит так, как вы просите:

StringBuilder sb = new StringBuilder();
foreach (char c in asciiString)
{
    uint i = (uint)c;
    sb.AppendFormat("{0:X2}", (i & 0xff));
}
return sb.ToString();
    
ответ дан Jim Mischel 14.04.2011 в 16:47
источник
0

Вот функция расширения:

        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» в качестве параметра, он автоматически разделит каждую двоичную последовательность.

    
ответ дан Krythic 23.06.2016 в 23:55
источник