Да, есть далеко, чтобы выяснить каждый поток контента. есть подпись для каждого файла на этой планете в дополнение к расширению, которое не является надежным. оно может быть удалено или добавлено неверно.
Так что же такое подпись ?
В вычислениях сигнатура файла - это данные, используемые для идентификации или проверки
содержимое файла. В частности, это может относиться к:
Волшебное число файла : байты в файле, используемые для идентификации
формат файла; как правило, короткая последовательность байтов (большинство
Длиной 2-4 байта) помещается в начало файла; см. список файла
подписи
Контрольная сумма файла или, в более общем случае, результат хеш-функции над содержимым файла: данные, используемые для проверки целостности файла
содержание, как правило, от ошибок передачи или злонамеренных атак.
Подпись может быть включена в конец файла или в отдельном
файл.
Я использовал магическое число , чтобы определить термин магического числа, который я копирую из Википедии
В компьютерном программировании термин магическое число имеет несколько
значения. Это может относиться к одному или нескольким из следующих:
- Уникальные значения с необъяснимым значением или множественные вхождения, которые (предпочтительно) можно заменить именованными константами
- Постоянное числовое или текстовое значение, используемое для идентификации формата файла или протокола; для файлов, см. Список файлов
подписи
- Отличительные уникальные значения, которые вряд ли будут приняты за другие значения (например, Глобально уникальные идентификаторы )
во второй точке это определенная последовательность байтов, подобная
PNG (89 50 4E 47 0D 0A 1A 0A)
или
BMP (42 4D)
Итак как узнать магический номер каждого файла?
в этой статье « Исследование сигнатур файлов с помощью PowerShell » мы обнаружили, что автор создал замечательную функцию Power Shell для получения магического числа, также он упомянул инструмент, и я копирую это из его статьи
PowerShell V5 содержит Format-Hex , который может предоставить альтернативу
подход к чтению файла и отображению шестнадцатеричного значения и значения ASCII для
определите магическое число.
форма Format-Hex help Я копирую это описание
Командлет Format-Hex отображает файл или другой ввод в шестнадцатеричном формате.
ценности. Чтобы определить смещение символа из выходных данных, добавьте
число в крайнем левом ряду на число в верхней части
столбец для этого символа.
Этот командлет может помочь вам определить тип файла поврежденного файла.
или файл, который может не иметь расширения имени файла. Запустите этот командлет,
а затем проверьте результаты для получения информации о файле.
этот инструмент очень хорош также для получения магического номера файла. Вот пример
другой инструмент - это онлайн-редактор шестнадцатеричных символов , но я не понял, как его использовать.
теперь мы получили магическое число, но как узнать , какой тип данных или это файл или поток?
и это самый хороший вопрос.
К счастью, существует множество баз данных для этих магических чисел. позвольте мне перечислить некоторые
- Подпись файла
- ТАБЛИЦА ПОДПИСЕЙ ФАЙЛОВ
- Список подписей файлов
например, первая база данных имеет возможность поиска. просто введите магический номер без пробелов и выполните поиск
после того, как вы можете найти. Да, может. Существует большая вероятность того, что вы не найдете нужный тип файла напрямую.
Я столкнулся с этим и решил, протестировав потоки с определенными типами подписей. Как PNG я искал в потоке
def GetPngStartingOffset(arr):
#targted magic Number for png (89 50 4E 47 0D 0A 1A 0A)
markerFound = False
startingOffset = 0
previousValue = 0
arraylength = range(0, len(arr) -1)
for i in arraylength:
currentValue = arr[i]
if (currentValue == 137): # 0x89
markerFound = True
startingOffset = i
previousValue = currentValue
continue
if currentValue == 80: # 0x50
if (markerFound and (previousValue == 137)):
previousValue = currentValue
continue
markerFound = False
elif currentValue == 78: # 0x4E
if (markerFound and (previousValue == 80)):
previousValue = currentValue
continue
markerFound = False
elif currentValue == 71: # 0x47
if (markerFound and (previousValue == 78)):
previousValue = currentValue
continue
markerFound = False
elif currentValue == 13: # 0x0D
if (markerFound and (previousValue == 71)):
previousValue = currentValue
continue
markerFound = False
elif currentValue == 10: # 0x0A
if (markerFound and (previousValue == 26)):
return startingOffset
if (markerFound and (previousValue == 13)):
previousValue = currentValue
continue
markerFound = False
elif currentValue == 26: # 0x1A
if (markerFound and (previousValue == 10)):
previousValue = currentValue
continue
markerFound = False
return 0
Как только эта функция нашла магическое число
Я разделил поток и сохранил файл png
arr = stream.read()
a = list(arr)
B = a[GetPngStartingOffset(a):len(a)]
bytesString = bytes(B)
image = Image.open(io.BytesIO(bytesString))
image.show()
В конце это несквозное решение, но это способ выяснить содержание потоков Спасибо за чтение и Спасибо за @Robert Columbia за его терпение