6db
@6db

Как побайтово перекодировать строку в hex-строку и обратно?

Есть 2 метода, кодировка текста в двоичный код, затем его запись в двоичном виде в файл.
Второй метод декодирует двоичную строку из файла обратно в текст.
//Конвертер String to Binary
        public string StrToBinary(string input)
        {
            StringBuilder str = new StringBuilder();

            //Итерируясь по каждому символу строки, переводим его в двоичную СС
            foreach (char L in input.ToCharArray())
            {
                str.Append(Convert.ToString(L, 2).PadLeft(8, '0'));
            }
            //Полученное выводим, как строку
            return str.ToString();

        }

//Перевод Binary в String
        public string BinToString (string input)
        {
            List<Byte> byteList = new List<Byte>();


            //Итерируюясь, извлекаем подстроку длинной 8 бит, конвертируем ее
            for (int i = 0; i < input.Length; i += 8)
            {
                
                byteList.Add(Convert.ToByte(input.Substring(i, 8), 2));
                
            }

            return Encoding.Default.GetString(byteList.ToArray());
            
        }


Так вот, с Английским все работает отлично, но вот русский откровенно встает. Ошибка:
5fbe7c710a032373179059.png

Перепробовал все кодировки, смотрел интернет, но зашел в тупик.
  • Вопрос задан
  • 719 просмотров
Решения вопроса 1
vabka
@vabka Куратор тега C#
Токсичный шарпист
Попробуйте так:
using System;
using System.Linq;
using System.Text;

var originalString = "Lorem ipsum dolor sit amet. Мама мыла раму";
Console.WriteLine($"Original string: {originalString}");

var utf8Bytes = Encoding.UTF8.GetBytes(originalString);
var hexadecimalUtf8Bytes = ConvertBytesToHexString(utf8Bytes);
Console.WriteLine($"Hexadecimal bytes: {hexadecimalUtf8Bytes}");

var convertedBytes = ConvertHexStringToBytes(hexadecimalUtf8Bytes);
var convertedString = Encoding.UTF8.GetString(convertedBytes);
Console.WriteLine($"Decoded: {convertedString}");

static string ConvertBytesToHexString(byte[] bytes) =>
    BitConverter.ToString(bytes).Replace("-", "");

static byte[] ConvertHexStringToBytes(string hex) =>
    Enumerable.Range(0, hex.Length)
        .Where(x => x % 2 == 0)
        .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
        .ToArray();


Original string: Lorem ipsum dolor sit amet. Мама мыла раму
Hexadecimal bytes: 4C6F72656D20697073756D20646F6C6F722073697420616D65742E20D09CD0B0D0BCD0B020D0BCD18BD0BBD0B020D180D0B0D0BCD183
Decoded: Lorem ipsum dolor sit amet. Мама мыла раму
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Русские символы в UTF-8 занимают два байта (если быть точным 11 бит, но это не точно). Соответственно у второго байта завершающие нули пропадают, и в итоге всё идёт в тартарары.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы