C # Как исправить потерю данных во время преобразования файла в двоичный файл в строку - PullRequest
0 голосов
/ 26 июня 2019

Я читаю файл как двоичный файл, преобразую в шестнадцатеричную строку, преобразую обратно в двоичный файл и записываю в новый файл. Я ожидаю дубликат, но получаю поврежденный файл.

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

            byte[] binary1 = File.ReadAllBytes(@"....Input.jpg");

            string hexString = "";                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
            int counter1 = 0;
            foreach (byte b in binary1)
            {
                counter1++;
                hexString += (Convert.ToString(b, 16));
            }

            List<byte> bytelist = new List<byte>();

            int counter2 = 0;
            for (int i = 0; i < hexString.Length/2; i++)
            {
                counter2++;
                    string ch = hexString.Substring(i*2,2);
                bytelist.Add(Convert.ToByte(ch, 16));

            }
            byte[] binary2 = bytelist.ToArray();

            File.WriteAllBytes(@"....Output.jpg", binary2);

Счетчик 1 и счетчик 2 должны быть одинаковыми, но счетчик 2 всегда примерно на 10% меньше.

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

1 Ответ

1 голос
/ 27 июня 2019

Преобразование байта 10 даст один символ, а не 2 символа. Ваш метод обратного преобразования (логически) основан на 2 символах на байт.

этот случай работает

byte[] binary1 = new byte[] { 100 }; // convert will result in "64"

и этот случай не удается

byte[] binary1 = new byte[] { 10 }; // convert will result in "a"

Я быстро исправил ваш код, добавив "0" в случае одного символа.

рабочий код:

byte[] binary1 = new byte[] { 100 };

string hexString = "";
int counter1 = 0;
foreach (byte b in binary1)
{
    counter1++;
    var s = (Convert.ToString(b, 16));
    // new
    if (s.Length < 2)
    {
        hexString += "0";
    }
    // end new
    hexString += s;
}

List<byte> bytelist = new List<byte>();

int counter2 = 0;
for (int i = 0; i < hexString.Length / 2; i++)
{
    counter2++;
    string ch = hexString.Substring(i * 2, 2);
    var item = Convert.ToByte(ch, 16);
    bytelist.Add(item);

}
byte[] binary2 = bytelist.ToArray();

Обратите внимание, что ваш код может использовать рефакторинг, например, не зацикливайте concat в цикле и, возможно, проверьте принцип единой ответственности.

Обновление, исправлено, но здесь есть лучшие решения: Как преобразовать байтовый массив в шестнадцатеричную строку и наоборот?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...