Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210

Почему в bytearray при использовании float отображаются не все байты?

22.11.2021, 11:46. Показов 827. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если не использую float, то в bytearray при выводе в консоль отображаются все байты:
Python
1
2
3
4
5
6
import struct
 
buffer = bytearray(10)
 
struct.pack_into('> 2B 2i', buffer, 0, 1, 255, 1, 255)
print(buffer) # (b'\x01\xff\x00\x00\x00\x01\x00\x00\x00\xff')
Теперь вывожу float:
Python
1
2
struct.pack_into('> 2B i f', buffer, 0, 1, 255, 1, 3.14)
print(buffer) # bytearray(b'\x01\xff\x00\x00\x00\x01@H\xf5\xc3')
Проверяю побайтно:
Python
1
2
for n in range(0, len(buffer)):
    print(n, buffer[n], sep='=', end='; ') # 0=1; 1=255; 2=0; 3=0; 4=0; 5=1; 6=64; 7=72; 8=245; 9=195;
Почему при использовании float в bytearray вместо 64 (0x12); 72 (0x34); 245 (0xF5); 195 (0xC3) отображается "что-то непонятное" - @H\xf5\xc3 и куда-то пропадают два последних байта?

Аналогичная ситуация происходит и при использовании модуля “ctypes”.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from ctypes import *
 
class F(Union):
    _fields_ = ("f", c_float), ("ch", 4 * c_char)
 
f = F(3.14)  
 
print(f.f)  # 3.140000104904175
print(f.ch)  # [COLOR="red"]b'\xc3\xf5H@'[/COLOR]
 
print(f.ch[0])  # 195 (0xC3)
print(f.ch[1])  # 245  (0xF5)
print(f.ch[2])  # 72  (0x34)
print(f.ch[3])  # 64  (0x12)
Что вообще обозначает эта последовательность знаков (@H\xf5\xc3 или \xc3\xf5H@)?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.11.2021, 11:46
Ответы с готовыми решениями:

OpenGL - Почему при использовании Translatef(); Двигаются все обьекты, а не только те, которые я определил?
Мне нужно чтобы из двух линий и двух точек двигалась только одна линия, для этого я использую следующий код: glColor3f(1, 0, 0); ...

Ошибка при использовании float
Привет Вот простенький код простенького скрипта: counter = 1 while counter < 100: print("Here you can find the square root...

attiny10 проблема при использовании float
Всем привет. В Microchip Studio 7 (Version: 7.0.2542 - ) столкнулся с проблемой. При использовании переменной по типу float в функции...

4
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
23.11.2021, 09:23
Python
1
2
struct.pack_into('> 2B i f', buffer, 0, 1, 255, 1, 3.14)
print(buffer, len(buffer), buffer.hex())
Code
1
bytearray(b'\x01\xff\x00\x00\x00\x01@H\xf5\xc3') 10 01ff000000014048f5c3
Добавлено через 1 минуту
Пример два:
Python
1
2
3
payload = b"Hello, wolrd!"
 
print(payload, payload.hex())
Code
1
b'Hello, wolrd!' 48656c6c6f2c20776f6c726421
1
394 / 194 / 48
Регистрация: 11.07.2013
Сообщений: 1,210
23.11.2021, 10:59  [ТС]
@H\xf5\xc3 или \xc3\xf5H@ - что это обозначает (какое-то сокращение, на указатель, вроде, не похоже)?
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
23.11.2021, 11:19
shyub, не дошло, окей, с просторов интернета:
При отображении литерала питон стремится отобразить его в как можно более удобном для человека виде, вот и отображает символы для соответствующих кодов. На содержимое байтовой строки это никак не влияет: b'k' и b'\x6b' это одно и то же, хранится в памяти одинаково и при сравнении равно друг другу, просто две разные формы записи одного и того же значения
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
23.11.2021, 21:22
shyub, Вам Fudthhh, все правильно сказал.
От себя добавлю то же самое но своими словами:
Питон оперирует байтами но работая со строками оперирует символами. Когда для символа используется больше одного байта, то bytearray работая с байтами выводит шестнадцатеричный код, когда символ соответствует одному байту, то питон вместо кода выводит символ.
Вот код, который это демонстрирует, в который я добавил для Вас строку 24:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Программа ВЫВОДИТ:
# В первой строчке выводится заданная строка
# Во второй строчке код каждого символа из данной строки 
              # в шестнадцатеричном формате и в двоичном формате.
# В третьей строчке последовательность байт для заданной строки.
 
def bi(ch):               
    print(hex(ord(ch)), end='->')           # шестнадцатеричный код символа
    return bin(ord(ch))                     # двоичный код символа
 
def codU(s):                                # последовательность байт в двоичном коде.
    bU = s.encode('utf8')
    b = bytearray(bU)
    for i in b:
        sb = bin(i)[2:]
        if len(sb) < 8:
            sb = '0'* (8 - len(sb)) + sb
        print(sb, end='|')     # последовательность байт для заданной строки
    print('')
 
 
if __name__ == '__main__':
    s = 'biби'
    print(bytearray(s, 'utf8'))
    #s = 'a\\o31b'
    print(s)                        # выводит заданную строку
    for ch in s:                    # выводит код очередного символа
        print(bi(ch), end='|')      # в шестнадцатеричном и двоичном формате
    print('')
 
    codU(s)                         # выводит последовательность байт для заданной строки.
 
    input('СТОП')                   # Эта строка нужна, только если вы запускаете код без 
                                    # отладчика, что бы не закрывалось DOS-окно.

Выводит:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
bytearray(b'bi\xd0\xb1\xd0\xb8')
biби
0x62->0b1100010|0x69->0b1101001|0x431->0b10000110001|0x438->0b10000111000|
01100010|01101001|11010000|10110001|11010000|10111000|
СТОП
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.11.2021, 21:22
Помогаю со студенческими работами здесь

Почему Ratchet не передаёт все байты?
Я отправляю с клиента через сервер (Ratchet скрипт из примера) в другой клиент байты, для начала отправил byte{49}, передалось, единица как...

Почему записывает не все принятые байты?
Включаю две программы, которые посылают и принимают байты. ...

Не скрываются/отображаются блоки при использовании JS
Здравствуйте! Появилась такая проблема - при попытке создать подобие слайдера, где блоки будут отображаться по мере клика на кнопки, JS код...

Не отображаются элементы при использовании медиазапросов
Одним словом придумал себе задачу сделать, чтобы иконки соц кнопок появлялись при уменьшении экрана &lt; 500px (width). Там у меня еще есть...

При использовании float:left колонки не ужимаются
Проблема в следующем. Есть контейнер, в нём две колонки, выровненные с помощью float:left, затем следует clearfix и ещё один див снизу. Я...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru