Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344

Как преобразовать в строку 16-байтный массив? (python 3)

24.04.2023, 23:53. Показов 1322. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всех приветствую. Есть cшная библиотека instead. Если афтор игры решит,lua файлы шифруются. Я решил написать дишифратор на python,основываясь на исходниках библиотеки,но в результате я могу получить байты больше чем 255,из-за чего возникает ошибка. Открываю файл как rb,т.к так реализовано в исходниках библиотеки. Затем вызываю функцию list,чтобы сложить туда байты. Проблема возникает не при чтении файла,а при работе алгоритма,т.е python не умеет работать с байтами больше 255. Подскажите пожалуйста,как их правильно приобразовать в строку. На всякий случай отправляю алгоритм,хотя для данного вопроса он не важен и я не прошу помочь исправить ошибки в нём. Я лишь прошу помочь мне сконвертировать в строку байты больше 255. Заранее всем огромное спасибо за помощь.
Python
1
2
3
4
5
6
7
byte =0xcc
#Читаем двоичный файл функцией open и получаем результат,используя метод read без аргументов. Затем,после закрытия файла,записываем результат в список a,используя функцию list,т.к с bytearray мы будем получать ошибку,что,мол,байты вне диапазона 0:256.
for i in range(len(a)):
 char =a[i]
 a[i]^=byte
 a[i]=(a[i]>>3)|(a[i]<<5)
 byte =char
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.04.2023, 23:53
Ответы с готовыми решениями:

Как преобразовать строку в массив
Помогите пожалуйста. После шифрования получилась строка с цифрами. Например 13342, 1 это отдельное число, так же 33 и 42. Нужно из строки...

Как преобразовать строку в массив?
Вот строка pw := 54321 form1.Edit4.Text := pw+pw+pw+pw+pw Как ее заменить (преобразовать) в массив... Char_String := pw ...

Как преобразовать массив в строку?
string str = Console.ReadLine(); string words = str.Split(new char{' ',',', '.', '!', '?'}); ...

7
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,304
25.04.2023, 00:43
Цитата Сообщение от КАВ Посмотреть сообщение
Есть cшная библиотека instead
Что за библиотека?
Цитата Сообщение от КАВ Посмотреть сообщение
результате я могу получить байты больше чем 255
Это как?
0
29 / 19 / 10
Регистрация: 24.04.2023
Сообщений: 62
25.04.2023, 01:32
Для преобразования массива байт в строку в Python 3 можно воспользоваться методом bytes.decode(). Например, если у вас есть массив байт byte_arr, вы можете преобразовать его в строку следующим образом:

Python
1
2
3
byte_arr = b'\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64'  # пример массива байт
str = byte_arr.decode('utf-8')  # преобразование в строку
print(str)  # 'Hello World'

В данном примере мы используем кодировку UTF-8 для преобразования массива байт в строку. Если вам нужна другая кодировка, замените 'utf-8' на соответствующее имя.

Обратите внимание, что некоторые значения в массиве байт могут не соответствовать символам ASCII или выбранной вами кодировке, поэтому результат преобразования может содержать некорректные символы или вызывать ошибки.
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
25.04.2023, 16:55  [ТС]
Ну за основу я брал код из https://github.com/instead-hub... ead.c#L617. Файл,который я хочу расшифровать,во вложении (нужно изменить расширение на .lua,хотя это,на мой взгляд,необязательно). И вот при побитовой работе с байтами они выходят за приделы 255.
Вложения
Тип файла: txt quake.txt (1.1 Кб, 8 просмотров)
0
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,304
26.04.2023, 13:11
В вашем коде не видно как Вы работаете с считаными данными из файла, так что на всякий случай момент 1:
При четнии из файла в бинарном режиме, возвращается набор байтов типа bytes, bytes не изменяемый тип, т.е. читать отдельные байты можно, перезаписывать нет. После чтения, bytes нужно преобразовать в bytesarray.

Момент 2:
bytes и bytesarray в качестве отдельных элементов возвращает int
В оригинале используется unsigned char, беззнаковый тип, по умолчанию размером 8 бит.
1 проблема в беззнаковости и битовом сдвиге вправо, в питоне нет беззнаковых типов как таковых, а у сдвига вправо есть две версии - логический и арифметический https://ru.wikipedia.org/wiki/... 0%B8%D0%B3. Но так как у нас байт расширяется до int и при этом диапазон возможных значений 0-255, первую проблему можно отбросить.
2 проблема в разнице размеров char/int и сдвиге влево, при сдвиге влево сдвигаемый старший бит отбрасывается, а так как инт больше чара, то 7 бит будет сдвигаться дальше, а не отбрасываться как в чаре. Здесь при сдвиге влево потребуется старшие биты принудительно обнулять после сдвига.

Python
1
2
3
4
5
6
7
8
9
10
with open('quake.txt', 'rb') as f_in:
    buf = bytearray(f_in.read())
    byte = 0xcc
    for i in range(len(buf)):
        char = buf[i]
        buf[i] ^= byte
        buf[i] = (buf[i] >> 3)  | ((buf[i] << 5) & 0xff)
        byte = char
    with open('quake_o.txt', 'wb') as f_out:
        f_out.write(buf)
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
26.04.2023, 19:18  [ТС]
Огромное Вам спасибо. Расшифровщик прекрасно работает. Не могли бы Вы пожалуйста по подробнее объяснить отличие работы с битами в c и python. Когда Вы писали,что int > char,Вы имели ввиду int в python? Почему проблемы возникают с седьмым (и,как я понимаю,более высшими битами) и почему нам нужно использовать побитовое и,я имею ввиду &255. Где можно подробнее прочитать про отличие работы с типами и,возможно,с битами,в c и python,чтобы я в дальнейшем,переписывая что-либо с c/c++ на python,не удивлялся,почему мой код не работает как следует. Ещё раз огромное Вам спасибо. Теперь всё прекрасно работает. Храни Вас Бог.
1
02.05.2023, 12:15

Не по теме:

kazak, зачем костылять, struct или ctypes в помощь.

0
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,304
09.05.2023, 15:05
Цитата Сообщение от КАВ Посмотреть сообщение
Где можно подробнее прочитать про отличие работы с типами и
Думаю сдесь должен помочь хороший учебник по информатике
Цитата Сообщение от Fudthhh Посмотреть сообщение
kazak, зачем костылять, struct или ctypes в помощь.
struct тут как бэ лишний, сам по себе struct это тот же bytes насколько я понял. ctypes да, но конкретно в этом примере мой костыль занимает меньше букф.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2023, 15:05
Помогаю со студенческими работами здесь

Расшифровываем байтный массив
Ребята, пытаюсь эмулировать сервер. но при получении от клиента коннекта - он присылает еще какуюто странную строку =( В начале были...

Как строку преобразовать в массив посимвольно?
Как строку преобразовать в массив посимвольно?

Как преобразовать массив байтов в строку
Как преобразовать массив байтов в строку. Допустим есть массив байтов - &quot;c7e0f8f3ecebe5ededeef1f2fc20f1e8&quot;. Если перевести в строку...

Как преобразовать json строку в массив?
Привет всем. Я пытаюсь преобразовать json строку из файла в массив. Перешел из php, и в php все делается одной строкой $langs =...

Как преобразовать строку в массив инт?
Знаю что задание в виде фото прилагать нельзя, но мне очень срочно надо решить задание. Как мне преобразовать строку в массив инт?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru