Уведомления

Группа в Telegram: @pythonsu

#1 Март 17, 2013 15:37:52

kaf
Зарегистрирован: 2013-03-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Распечатать код

Это сделали забугорные корифеи! Я пытаюсь вставить промежуточную контрольную печать только.
Переделывать тип буфера нельзя. Как вы видите, после return ожидается строка для последующей
обработки. Что уж есть!
Скорее всего для конвертации нужно использовать code() - decode() , которые мне не известны.

Офлайн

#2 Март 19, 2013 13:20:01

kaf
Зарегистрирован: 2013-03-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Распечатать код

s0rg
Благодаря вашей активности пришлось поднапрячься - в результате я получил
два способа решения этой задачки. Первый - простой и ограниченный по возможностям,
второй - несколько сложнее, но универсальный и мощный.
В 1-м способе можно только распечатать в 16-ричном виде строковый буфер. я его сейчас
вовсю использую. Для целей контрольной печати - это то что надо!
Во 2-м методе используется объединение Union, в котором на байты накладываются
поля строкового и числового типа. Затем объект этого класса инициализируется одним
типом, а используется, если надо другой тип.
Вот и вся здача!

 >>> s = 'j'
>>> h = s.encode('hex')
>>> print "0x%s\n" % h
0x6a
===========================================
>>> from ctypes import *
>>> class str_h(Union): \
_fields_ = [("str1", c_char_p), ("num1", c_long)]
>>> ob1 = str_h(s)
>>> s1 = ob1.str1
>>> n1 = ob1.num1
>>> print "s1 = %s" % s1
s1 = j
>>> print "n1 = %ld" % n1
n1 = 10581588
>>> ord('j')
106

Офлайн

#3 Март 19, 2013 15:22:56

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Распечатать код

c_long - это как-бы не один байт совсем

Офлайн

#4 Март 20, 2013 01:20:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Распечатать код

>>> s = 'abcd'
>>> ''.join(map('{:02x}'.format, map(ord, s)))
'61626364'
>>>



Офлайн

#5 Март 20, 2013 15:13:27

kaf
Зарегистрирован: 2013-03-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Распечатать код

s0rg, насчёт c_long - согласен. Просто мысль использовать объединение пришла уже в конце,
и я на безразмерное поле c_char_p, долго не думая, с запасом дал другое поле c_long.
Вижу, вроде идёт - на этом и остановился. И как было в эксперименте, так не шлифуя
скопировал сюда.
py.user.next, ваше предложение тоже интересно. Если бы вы ещё прокомментировали
действие этих двух map() ?, а заодно - зачем метод join() применён к пробелу?

Офлайн

#6 Март 21, 2013 03:07:33

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Распечатать код

открой интерпретатор и набери

help(map)
help(''.join)

kaf
зачем метод join() применён к пробелу?
он вызывается не у пробела, а у пустой строки

чтобы понять, как работает строка, нужно читать её справа налево изнутри наружу
этот способ перевода работает в обеих версиях питона (в третьем нет кодировки hex)



Офлайн

#7 Март 21, 2013 13:20:09

kaf
Зарегистрирован: 2013-03-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Распечатать код

Да, посмотрел в Справке и проверил - это символ разделителя, если есть. А у меня только что-ли требуется ноль перед символом “ : ” в {…} , (у меня версия 2.6).

Офлайн

#8 Март 21, 2013 19:10:58

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Распечатать код

kaf
А у меня только что-ли требуется ноль перед символом
это да, раньше в версии 3.0 нужно было обязательно ставить номер поля, потом они сделали возможность пустого номера поля, а потом перенесли это и во второй питон, поэтому в версии 2.7 можно не ставить

kaf
у меня версия 2.6
там многого нет, например, множественных включений
>>> {i for i in 'abc'}
set(['a', 'c', 'b'])
>>>



Отредактировано py.user.next (Март 21, 2013 19:11:34)

Офлайн

#9 Март 22, 2013 13:35:23

kaf
Зарегистрирован: 2013-03-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Распечатать код

py.user.next - спасибо!
Хотел добавить вам благодарность, нажал на ваш зелёный ‘+’ , но
дальше не смог разобраться, пришлось отменить.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version