Как преобразовать необработанные данные в файл JPEG с помощью С#

У меня есть такая строка:

string x = 0x424D3630090000000000360010028000000C00100200011111111111333333333000000C40E0000C40E000000088888888BBBBCC262281FF231F7EFF251D81FF....."

Мне сказали преобразовать эту строку в изображение JPEG, я не уверен в фактическом типе данных этой строки и не знаю, как преобразовать ее в JPEG. Не могли бы вы дать мне хотя бы несколько советов по этому поводу? Заранее спасибо.

РЕДАКТИРОВАТЬ:

Я преобразовал строку в массив байтов следующим образом:

 byte[] bytes = Convert.FromBase64String("0x424D363009..");

И я получаю это исключение:

Недопустимая длина массива символов Base-64 или строки.


person jason    schedule 06.11.2017    source источник
comment
Возможный дубликат преобразования строки base 64 в изображение и сохранить его   -  person SᴇM    schedule 06.11.2017
comment
Преобразуйте его в набор байтов, а затем вы конвертируете байты в jpeg на С#, из которых здесь, в переполнении стека, есть множество вопросов и ответов.   -  person Lasse V. Karlsen    schedule 06.11.2017
comment
Не очень хорошо знаком с С#, но, похоже, это шестнадцатеричная строка, поэтому сначала узнайте, как преобразовать шестнадцатеричную строку в массив байтов, а затем массив байтов в изображение.   -  person Rahul K    schedule 06.11.2017
comment
Глядя на первые два шестнадцатеричных значения — 0x42 0x4D — я бы предположил, что строка представляет собой файл BitMap - это должно дать отправную точку после преобразования в массив байтов.   -  person PaulF    schedule 06.11.2017
comment
@PaulF, пожалуйста, посмотрите мое обновление.   -  person jason    schedule 06.11.2017
comment
Это не базовая строка 64 - каждая пара символов представляет 8-битное значение, поэтому ваш массив должен быть - 0x42, 0x4D, 0x36, 0x30 ..... поэтому вам, возможно, придется вручную преобразовать каждую пару символов. Глядя на вашу строку, я думаю, что там есть ошибка, так как я ожидаю, что 00,00,00,28 будет следовать за 36 - см. Также это: asecuritysite.com/forensics/bmp?file=activated.bmp   -  person PaulF    schedule 06.11.2017
comment
@SeM-ՍեՄ Спасибо, но это не сработало..   -  person jason    schedule 06.11.2017
comment
stackoverflow.com/questions/321370/ Как заявил @PaulF, это не base64. Посмотрите на примеры base64, и это будет очевидно. Сначала выполните шаги в связанном вопросе SO, а затем конвертируйте из BitMap в JPEG.   -  person Novaterata    schedule 06.11.2017
comment
если вы используете ссылку из @Novaterata, вам нужно либо удалить начальный 0x, либо пропустить его в возвращаемых значениях, изменив предложение where на .Where(x =› x › 1 && x % 2 == 0)   -  person PaulF    schedule 06.11.2017
comment
Это для какого класса? Обратный инжиниринг формата файла? Потому что эти данные начинаются с BM6 в качестве индикатора формата файла, что мне кажется чем-то вроде bmp.   -  person Nyerguds    schedule 16.11.2017


Ответы (1)


ОБНОВИТЬ:

Еще одно возможное решение: вы можете получить byte[] из этой HEX-строки, используя:

string x = GetYouHexString();
x = x.Remove(0,2);
string[] stringArr = Enumerable.Range(0, x.Length / 2)
                               .Select(i => x.Substring(i * 2, 2))
                               .ToArray();
byte[] byteArr = Array.ConvertAll(stringArr , b => Convert.ToByte(b, 16));

затем сохраните его, используя MemoryStream и Image:

using(Image image = Image.FromStream(new MemoryStream(byteArr)))
{
    image.Save("output.jpg", ImageFormat.Jpeg);
}
person SᴇM    schedule 06.11.2017
comment
Это дало недопустимый параметр. ошибка в этой строке: using(Image image = Image.FromStream(new MemoryStream(byteArr))) - person jason; 06.11.2017
comment
@jason, где ты это проверял? - person SᴇM; 06.11.2017
comment
В Visual Studio. - person jason; 06.11.2017
comment
Если ваша строка такая же, как указано выше, то она, вероятно, неверна, поскольку имеет неправильную информацию заголовка - как я уже сказал выше, я ожидал бы 00000028 после второго 36. - person PaulF; 06.11.2017
comment
Я создал консольное приложение и проверил, работает отлично. - person SᴇM; 06.11.2017
comment
@PaulF Оригинальная первая часть выглядит так: 424D36300900000000003600000028000000C00100005001000001 - person jason; 06.11.2017
comment
@PaulF Я это понимаю, только я был занят и тестировал только этот, но это даст ему основное представление, как это сделать. Например, он может добавить начальный 0x к каждому байту строки внутри метода Convert.ToByte. - person SᴇM; 06.11.2017
comment
@Jason: это имеет больше смысла - это растровое изображение 448 (0x000001C0) x 336 (0x00000150). - Обратите внимание, что значения сначала сохраняются младшим байтом. - person PaulF; 06.11.2017
comment
@PaulF, так что мне делать? Применим ли ответ сем-уту? Я пробовал другие методы преобразования, которые я нашел на SO, они тоже не работали. - person jason; 06.11.2017
comment
Преобразование в массив байтов выглядит правильно, как и в приведенной выше ссылке Novaterata (если вы пропустите 0x, как я уже сказал) - эта ссылка может работать: stackoverflow.com/questions/21555394/ - person PaulF; 06.11.2017
comment
Я попробовал ссылку @Novaterata и получил следующее: System.ArgumentOutOfRangeException' Индекс и длина должны относиться к местоположению в строке - person jason; 06.11.2017
comment
Какова длина вашей строки? - Похоже, вы пропустили только 0, а не 0x, или после пропуска двух символов у вас есть строка с нечетным количеством символов - поскольку каждый байт представлен в строке двумя символами - строка, переданная в StringToByteArray, ДОЛЖНА быть даже по длине. Я попробовал ответ @SeM-ՍեՄ + тот, на который я только что ссылался, и оба работают, когда задан допустимый массив байтов. - person PaulF; 06.11.2017
comment
Да, со строкой что-то не так, ее длина всегда нечетная... - person jason; 06.11.2017
comment
Для базового 24-битного растрового изображения 448x336 я ожидаю, что размер файла составит 451638 байт ((448 x 336) x 3 байта на пиксель + заголовок 54 байта), поэтому длина строки составит 903278 (включая 0x спереди). - person PaulF; 06.11.2017
comment
@PaulF Есть ли способ преобразовать строки нечетной длины в изображение? - person jason; 06.11.2017
comment
Как я уже сказал, каждый байт представлен двумя шестнадцатеричными символами, поэтому действительная строка никоим образом не может иметь нечетную длину. Вы можете попробовать удалить последний символ или добавить дополнительный 0 (или другой допустимый шестнадцатеричный символ). Вы должны иметь возможность сохранить массив байтов с помощью File.WriteAllBytes в виде файла .bmp и посмотреть, что вы получите. - person PaulF; 06.11.2017
comment
Давайте продолжим это обсуждение в чате. - person jason; 06.11.2017
comment
@PaulF, когда я добавляю «0» или удаляю последний символ, я получаю сообщение Параметр недействителен. исключение... - person jason; 06.11.2017
comment
Когда я сохраняю .bmp, Windows жалуется, что это недопустимый файл .bmp. - person jason; 06.11.2017