строковые значения в байтовый массив без преобразования - PullRequest
2 голосов
/ 06 июня 2011

Я пытаюсь поместить значения строки в байтовый массив без изменения символов. Это потому, что строка на самом деле является байтовым представлением данных.

Цель состоит в том, чтобы переместить входную строку в байтовый массив и затем преобразовать байтовый массив, используя:

string result = System.Text.Encoding.UTF8.GetString(data);

Я надеюсь, что кто-то может мне помочь, хотя я знаю, что это не очень хорошее описание.

EDIT: И, возможно, я должен объяснить, что я работаю над простой формой окон с текстовым полем, где пользователи могут скопировать в нее закодированные данные, а затем нажать «Предварительный просмотр» для просмотра декодированных данных.

EDIT: Еще немного кода: (inputText - это текстовое поле)

    private void button1_Click(object sender, EventArgs e)
    {
        string inputString = this.inputText.Text;
        byte[] input = new byte[inputString.Length];
        for (int i = 0; i < inputString.Length; i++)
        {
            input[i] = inputString[i];
        }
        string output = base64Decode(input);
        this.inputText.Text = "";
        this.inputText.Text = output;
    }

Это часть формы окна, включающая в себя текстовое поле. Этот код не работает, потому что он не позволяет мне преобразовывать тип char в байт. Но если я изменю строку на:

    private void button1_Click(object sender, EventArgs e)
    {
        string inputString = this.inputText.Text;
        byte[] input = new byte[inputString.Length];
        for (int i = 0; i < inputString.Length; i++)
        {
            input[i] = (byte)inputString[i];
        }
        string output = base64Decode(input);
        this.inputText.Text = "";
        this.inputText.Text = output;
    }

Он кодирует значение, и я этого не хочу. Надеюсь, это немного лучше объясняет, что я пытаюсь сделать.

РЕДАКТИРОВАТЬ: функция base64Decode:

    public string base64Decode(byte[] data)
    {
        try
        {
            string result = System.Text.Encoding.UTF8.GetString(data);
            return result;
        }
        catch (Exception e)
        {
            throw new Exception("Error in base64Decode" + e.Message);
        }
    }

Строка не закодирована с использованием base64, просто для ясности. Это просто плохое название от моего имени.

Обратите внимание, что это всего лишь одна строка ввода.

Я понял. Проблема была в том, что я всегда пытался декодировать неправильный формат. Я чувствую себя очень глупо, потому что, когда я опубликовал пример ввода, я увидел, что это должен быть шестнадцатеричный код, и с тех пор это было легко. Я использовал этот сайт для справки: http://msdn.microsoft.com/en-us/library/bb311038.aspx

Мой код:

     public string[] getHexValues(string s)
     {
        int j = 0;
        string[] hex = new String[s.Length/2];
        for (int i = 0; i < s.Length-2; i += 2)
        {
            string temp = s.Substring(i, 2);
            this.inputText.Text = temp;
            if (temp.Equals("0x")) ;
            else
            {
                hex[j] = temp;
                j++;
            }
        }
        return hex;
    }

    public string convertFromHex(string[] hex)
    {
        string result = null;
        for (int i = 0; i < hex.Length; i++)
        {
            int value = Convert.ToInt32(hex[i], 16);
            result += Char.ConvertFromUtf32(value);
        }
        return result;
    }

Сейчас я чувствую себя довольно глупо, но спасибо всем, кто помог, особенно @Jon Skeet.

Ответы [ 4 ]

5 голосов
/ 06 июня 2011

Вы говорите, что у вас есть что-то вроде этого:

string s = "48656c6c6f2c20776f726c6421";

а вы хотите эти значения в виде байтового массива? Тогда:

public IEnumerable<byte> GetBytesFromByteString(string s) {
    for (int index = 0; index < s.Length; index += 2) {
        yield return Convert.ToByte(s.Substring(index, 2), 16);
    }
}

Использование:

string s = "48656c6c6f2c20776f726c6421";
var bytes = GetBytesFromByteString(s).ToArray();

Обратите внимание, что на выходе

Console.WriteLine(System.Text.ASCIIEncoding.ASCII.GetString(bytes));

есть

Hello, world!

Вы, очевидно, должны сделать вышеописанный метод намного безопаснее.

1 голос
/ 06 июня 2011

Кодирование имеет обратный метод:

byte[] data  = System.Text.Encoding.UTF8.GetBytes(originalString);

string result = System.Text.Encoding.UTF8.GetString(data);

Debug.Assert(result == originalString);

Но что вы имеете в виду «без конвертации», неясно.

1 голос
/ 06 июня 2011

Один из способов сделать это - написать:

string s = new string(bytes.Select(x => (char)c).ToArray());

Это даст вам строку, содержащую один символ на каждый байт в массиве.используйте 8-битную кодировку символов.Например:

var MyEncoding = Encoding.GetEncoding("windows-1252");
string s = MyEncoding.GetString(bytes);

Я думаю , что Windows-1252 определяет все 256 символов, хотя я не уверен.Если этого не произойдет, вы будете в конечном итоге с преобразованными персонажами.Вы должны быть в состоянии найти 8-битную кодировку, которая сделает это без какого-либо преобразования.Но вам, вероятно, лучше использовать цикл байтов для символов выше.

0 голосов
/ 06 июня 2011

Вы пробовали:

string s = "....";
System.Text.UTF8Encoding.UTF8.GetBytes(s);
...