Можно ли в Python создавать бинарные файлы? Конечно можно.
Для этого в Python есть следующие инструменты:
▫️ тип данных bytes и bytearray
▫️ открытие файла в режиме wb (write binary) или rb (read binary)
▫️ модуль struct
Про модуль struct поговорим в первую очередь.
Файл в формате JSON или Yaml внутри себя содержит разметку данных. Всегда можно определить где список начался а где закончился. Где записана строка а где словарь. То есть формат записи данных содержит в себе элементы разметки данных.
В binary-файле данные не имеют визуальной разметки. Это просто байты, записанные один за другим. Правила записи и чтения находятся вне файла.
Модуль struct как раз и помогает с организацией данных в таком файле с помощью определения форматов записи для разных частей файла.
Модуль struct преобразует Python-объекты в массив байт, готовый к записи в файл и имеющий определённый вид.
Для этого всегда следует указывать формат преобразования (или, как оно здесь называется - запаковки).
Формат нужен для того, чтобы выделить достаточное количество байт для записи конкретного типа объекта. В последствии с помощью того же формата будет производиться чтение.
При этом следует помнить что мы говорим о типах языка С а не Python.
Именно формат определяет, что записано в конкретном месте файла, число, строка или что-то еще.
Вот какие токены формата у нас есть.
Помимо этого, первым символом можно указать порядок байтов. На разных системах одни и те же типы данных могут записываться по-разному, поэтому желательно указать конкретный способ из доступных. Если этого не сделать, то используется символ '@', то есть нативный для текущей системы.
В строке формата мы пишем в каком порядке и какие типы собираемся преобразовать в байты.
Запакуем в байты простое число, токен "i".
>>> import struct
>>> struct.pack('=i', 10)
b'\n\x00\x00\x00'
Теперь несколько float, при этом нужно передавать элементы не массивом а последовательностью аргументов.
>>> struct.pack('=fff', 1.0, 2.5, 4.1)
b'\x00\x00\x80?\x00\x00 @33\x83@'
Вместо нескольких токенов можно просто указать нужное количество элементов перед одним токеном, результат будет тот же.
>>> struct.pack('=3f', 1.0, 2.5, 4.1)
b'\x00\x00\x80?\x00\x00 @33\x83@'
Теперь запакуем разные типы
>>> data = struct.pack('=fiQ', 1.0, 4, 100500)
я запаковал типы float, int и unsigned long long (очень большой int, на 8 байт)
b'\x00\x00\x80?\x04\x00\x00...'
Распаковка происходит аналогично, но нужно указать тот же формат, который использовался при запаковке. Результат возвращается всегда в виде кортежа.
>>> struct.unpack('=fiQ', data)
(1.0, 4, 100500)
Как видите, ничего страшного!
#lib#basic
Как пелось в песне... не стареют душой ветераны.
А некоторые из них ещё духом и даже телом.
Один британский моряк-ветеран Второй Мировой подвергся нападению грабителей, когда ему было уже за 80. Двое молодых и наглых решили, что дедушка с тростью лёгкая добыча. Подойдя к нему они потребовали у него кошелек. Дед согласился, но попросил достать кошелек из кармана самим, так как ему трудно достать... Артрит там, артроз и всякая такая подагра. Когда один из грабителей наклонился, чтобы залезть в карман за кошельком, то получил от дедушки кулаком в нос. Затем и другому прилетел хук слева, а потом оба ещё получили тростью по жбану, после чего грабители, офигевшие от такого напора жертвы, сделали ноги. Не знали они, что дедушка после гибели своего корабля почти неделю провел в море со сломанной ногой и стал единственным выжившим из всего экипажа, потому что до службы занимался спортом. А после войны стал профессиональным боксером, дрался на ринге, как в перчатках, так и без. Конечно, кошелек не стоит жизни, но ветеран решил дать последний бой и победил. На принцип, видимо, пошёл.
#rn
И смех и грех. В море австралийский крейсер "Канберра" заметил британское судно "Драматик". Обнаружение было обоюдным, так как транспорт начал открыто радировать в эфир, что его преследует военный корабль с тремя трубами. Крейсер потратил десять минут, чтобы связаться с ним и приказал прекратить драматизировать и свернуть трагедию в эфире. #rn
Во время Второй Мировой британцы передали часть своих подводных лодок экипажам из союзных стран. Последние формировались из подводников, бежавших в Великобританию после оккупации их стран Германией, чтобы продолжить борьбу с Гитлером.
Союзные подлодки находились в оперативном подчинении Королевского флота, а в подводных силах метрополии была флотилия, состоявшая из союзных подлодок.
Британские субмарины были переданы норвежским, голландским, греческим, польским экипажам, а также французским из «Свободной Франции».
Но был нюанс. Всем перечисленным экипажам были переданы подлодки типа U, за исключением голландцев, которые получили подлодки типа Т.
Подлодки типа U по своим характеристикам не могли сравниться с типом Т, ни по вооружению, ни по автономности, ни по условиям жизни на борту.
Подлодки тип Т на тот момент были пиком вершины британского подплава - самыми грозными британскими подводными кораблями, способными разом атаковать цель десятью торпедами. Так почему же голландцы были удостоены доверия и получили возможность воевать на тип Т, а другие союзники нет?
Ваши соображения?)
#sub#rn
А документы, граждане, треба носить с собою (с)
Любопытный казус произошел в мае 1940-го, когда британская субмарина остановила в море судно в Норвежском море. Проверка документов выявила британского "купца", который направлялся в Мурманск. Судно было отпущено. Однако, британские подводники не догадались, кого они задержали. Это было британское судно-ловушка, привлекавшее к себе внимание немецких подлодок. Когда британская субмарина была замечена, то командир судна решил не раскрывать себя и ловушка притворилась обыкновенным транспортом. Липовые судовые документы проверку выдержали. ⚓️🇬🇧. #rn#sub
Храбрые итальянские моряки
Британская субмарина "Амбра" схлестнулась в бою с итальянским пароходом "Джима". Так как выходить в торпедную атаку на него было неудобно, британцы решили расправиться со старым судном с помощью 102-мм пушки. Но и у итальянцев тоже была пушка - 76-мм. "Амбра" открыла огонь с трех км, но уже после восьмого выстрела противника была вынуждена быстро смыться с помощью срочного погружения. Причина: итальянцы стреляли настолько метко, что британцами стало ясно - победы в артбою им не одержать. После этого "Амбра" всё-таки попыталась выйти в торпедную атаку, но "Джима", выжимая из своей машины что можно и нещадно тратя уголь, ушёл от ПЛ, которая так и не рискнула всплыть снова. В итоге, густо дымя, уходивший пароход, как бы дразнил противник, который беспомощно сидел под водой.
#rn#sub
"Трудная мишень"
Действуя у побережья Греции британская ПЛ "Торбей" обнаружила любопытный караван. Три буксира, идущие в кильватерной колонне, тащили за собой плавучий док в охранении шести небольших военных кораблей. Док был здоровый более 100 М длиной, плыл с небольшой скоростью. Практически, идеальная мишень, если бы не одно но - осадка целей была тоже небольшая. Командир ПЛ решил, что глубины хода торпед в метр будет достаточно и выпустил по буксирам и доку шесть торпед. И не дождался ни одного взрыва. Судя по всему, торпеды прошли под целями, так как дистанция до них была чуть более 1 км, а цели не меняли курса и скорости.
Потерпев неудачу, британцы плюнули и решили, что надо вообще пустить торпеды по поверхности, так как при такой дальности увернуться цели бы точно не успели. Тогда ПЛ выпустила две торпеды с углублением в 0 и они обе попали в док, потопив его.
#sub#rn
Британская ПЛ "Танталус" обнаружила у Малаккского полуострова и обстреляла небольшой японский каботажник. Первый выпущенный снаряд попал в цель и вызвал пожар в средней части судна, а последующие выстрелы - пламя в машинном отделении. После пяти выстрелов огонь был прекращен, и команда покинула судно. Затем было выпущено еще десять снарядов, чтобы прикончить его. Каботажник назывался "Паханг Мару", он направлялся из Куантана в Бангкок с 75 бочками мазута и 9 бочками смазочного масла. Затем он должен был загрузить 250 тонн риса в Бангкоке для возвращения в Куантан. После гибели судна следующие полчаса у британцев ушли на то, чтобы подобрать выживших, среди которых было девять малайцев, один китаец и один японский солдат. Последний уплыл далеко от остальных и поначалу отказывался от того, чтобы его поднимали. После безуспешной попытки утопиться он в конце концов схватился за трос и был поднят на борт. Японец обгорел и был очень напуган. Командир ПЛ лейтенант-коммандер Маккензи решил избавиться от местного экипажа как можно скорее. Он посадил местный экипаж на борт первой встретившейся китайской джонки. Японец, судя по всему, остался на борту лодки.
#sub#rn
Британский "Лунин".
9 ноября 1941-го командир британской ПЛ "Апхолдер" Д. Ванклин (по итогам войны самый результативный подводник Великобритании) оказался в схожей ситуации, что и командир К-21 Н. Лунин 5 июля 1942-го.
После разгрома британскими крейсерами и эсминцами итальянского конвоя "Дуйсбург" лодка Ванклина атаковала итальянские эсминцы проводивших подбор выживших с судов конвоя. Торпеды "Апхолдер" оторвали корму эсминцу "Libeccio", который после этого не затонул и был взят на буксир другим эсминцем. Позже в тот же день Ванклин атаковал два тяжелых крейсера класса "Trento" тремя торпедами. Согласно итальянским источникам, его целью была оперативная группа, состоявшая из тяжелых крейсеров "Trento" и "Trieste" в сопровождении эсминцев "Granatiere" , "Fuciliere", "Bersagliere" и "Alpino" . После торпедного залпа торпеды повели себя по разному: две пошли в сторону целей, а третья оказалась "бегуном по кругу", начав кружить над подлодкой, ушедшей после залпа на глубину. Там Ванклин услышал два взрыва и шумы тонущего корабля. Когда он подсплыл под перископ, то увидел два крейсера и эсминец. Так как перед торпедной стрельбой Ванклин видел рядом с крейсерами два эсминца, а уже после атаки был виден только один из них, то командир ПЛ решил, что торпеды поразили один из эсминцев, о чем и говорили шумы тонущего корабля. Поэтому Ванклин с чистой совестью посчитал, что в крейсера он не попал, но потопил один из сопровождавших их эсминцев. Что оказалось в реальности? Торпеды "Апхолдер" прошли мимо целей, а услышанные звуки тонущего корабля действительно были звуками тонущего эсминца, но это был поврежденный в предыдущей атаке эсминец "Libeccio", у которого как раз в момент нападения ПЛ на крейсера не выдержали переборки и он пошёл на дно. Вот такая интересная история. Схожесть случаев Ванклина и Лунин большая: оба атаковали группу тяжёлых кораблей, оба в в них не попали и оба предположили, что результатом их атак стало торпедирование эсминца.
#sub#rn
Батюшки, сколько "бегунов по кругу", да только не немецкие или американские, а британские! В сентябре 1941 британская ПЛ два раза выходила в атаку за свой поход и каждый раз в залпе оказывалась неисправная торпеда, начинавшая кружить вокруг лодки. Похоже, что и у британцев были серьёзные проблемы с гироскопами и, но про это известно куда меньше.
#sub#rn
Из любопытного.
Во время похода у побережья Суматры британская ПЛ искала пригодный сампан (азиатская лодка-плоскодонка), нужный для выполнения разведзадания. Сампан нашли. В нем было пять туземцев-сборщиков кокосов и обезьяна, обученная лазить за кокосами на дерево. Всю команду сампана сняли и перевели на ПЛ. Люди то перешли к британцами на борт без проблем, а вот с обезьяной пришлось повоевать, так как она отказалась сдаваться британцами в плен. Так что подводники Его Величества побегали за ней по сампану. Может даже кого-то из них покусали.
#rn#sub