#c# #string #binary #types
#c# #строка #двоичный #типы
Вопрос:
У меня есть функция для преобразования строки в шестнадцатеричный формат следующим образом,
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;
}
Комментарии:
1.
char
=>int
=>string
uint
=>uint
(снова?) … вау! Здесь я запутался.2. Вы, кажется, думаете, что это
ToUInt32
то, что выполняет преобразование в шестнадцатеричное значение, но на самом деле этоx2
спецификатор форматирования для строки. Форматирование. К сожалению, я не думаю, что существуетb8
спецификатор формата.3. Вы можете реализовать ICustomFormatter, показанный по ссылке MSDN
Ответ №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));
Комментарии:
1. Пожалуйста, используйте
System.Text.UTF8Encoding
.2. В его примере в качестве параметра указан asciiString. Я также не знаю, какого формата должен быть двоичный массив. Но вы можете изменить кодировку по требованию.
3. @JSBangs Операционная система, похоже, хочет использовать ASCII. Но вы правы, это не то, что делает исходный код, и это, вероятно, тоже не сработало бы. Но использование UTF8 все же делает что-то другое. Эквивалентом кода OP было бы использовать
Unicode
.4. В OP использовалось имя переменной «asciiString», но это не меняет того факта, что строка является ФАЙЛОМ UTF-16 (потому что это то, что
string
всегда есть). На мой взгляд, единственная причина когда-либо использовать кодировку, отличную от Юникода, заключается в тонком интерфейсном слое устаревшей системы, который нельзя изменить. И даже тогда, это только до тех пор, пока не будет заменена устаревшая система. Теперь OP может говорить, что символы вasciiString
ограничены диапазоном ASCII (7-битные значения). Если это так, решение в формате UTF-8 будет идентично решению в формате ASCII, поэтому UTF-8 следует использовать в любом случае.5. @JSBangs Прав, я полностью согласен с этим. Мой комментарий был скорее в том направлении, что UTF8, вероятно, также неверен или, по крайней мере, не то, что код в настоящее время делает для любой кодовой точки> 127.
Ответ №2:
Похоже, что вы в основном хотите преобразовать строку ASCII или, что более предпочтительно, байт[] (поскольку вы можете закодировать свою строку в байт [], используя предпочитаемый вами режим кодирования) в строку единиц и нулей? т.е. 101010010010100100100101001010010100101000101000010111101101010
Это сделает это за вас…
//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 resu<
}
Ответ №3:
Вот функция расширения:
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 amp;amp; i < (data.Length - 1))
{
buffer[index] = ' ';
index ;
}
}
return new string(buffer);
}
Вы можете использовать это как:
Console.WriteLine("Testing".ToBinary());
и если вы добавите ‘true’ в качестве параметра, это автоматически разделит каждую двоичную последовательность.
Ответ №4:
Следующее даст вам шестнадцатеричную кодировку для младшего байта каждого символа, которая выглядит так, как вы просите:
StringBuilder sb = new StringBuilder();
foreach (char c in asciiString)
{
uint i = (uint)c;
sb.AppendFormat("{0:X2}", (i amp; 0xff));
}
return sb.ToString();