2014-01-30 3 views
1

я иллюстрируют случай для того, где к = 2 (так, нижние 12 цифр)Лучший способ кодирования base64 последние 6k биты целого числа питона

import base64 

# Hi 
# 7 - 34 
# 000111 - 100010 
# 0001 - 1110 - 0010 = 0x1E2 = 482 

# 1 
integer = int(bin(482)[-12:] + '0' * 20, 2) 
encoded = base64.b64encode(base64.b16decode('{0:08X}'.format(integer))) 
print encoded 

# 2 
encoded = base64.b64encode(base64.b16decode('{0:08X}'.format(482 << 20))) 
print encoded 

Оба вывода HiAAAA == по желанию

Идеальная ссылка для вашего удобства: http://ideone.com/O73kQs

Интуитивно это очень ясно, и я предпочитаю # 2 совсем немного. Одна вещь, которая «раздражает» меня около # 1, заключается в том, что если целые числа в python не являются 32 битами, тогда у меня проблемы. Как я могу получить правильный размер int? (Всего питон новичок вопрос?) (Редактирование: да, по-видимому, новичок-иша вопрос How can i determine the exact size of a type used by python)

Было бы хорошо, однако, если есть способ, чтобы просто сделать что-то вроде

encoded = base64.b64encode('{0:08X}'.format(482 << 20)) 

Кроме того, как я могу перейти от

bin(1) 

которая равна

'0b1' 

к двоичном буквальный

0b1 

ответ

1

вы можете перейти от бункера обратно с междунар, который принимает дополнительный 2-й параметр, который является базовым

int(bin(18)[2:],2) 

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

вы можете сделать

print 0b1 

и посмотреть, что фактические магнезии десятичного значение ...

, чтобы получить последние 12 бит в INT

my_int = 482 
k=2 
mask = int("1"*(6*k),2) 
last_bits = my_int & mask 

, то вы можете просто перенести его 20 или что-то ...

сначала получить последние 12 битов, как показано выше

import struct 
print struct.pack('H',last_bits) 
print struct.pack('H',0b100001) 

качестве альтернативы можно

def get_chars(int_val): 
    while int_val > 0: 
     yield chr(int_val & 0xFF) 
     int_val <<= 8 

print repr("".join(get_chars(last_bits))) 
+0

Наверное, я просто надеялся, что что-то вроде «str (0b100001)« Мог бы дать мне »!» а не «100001». =/ –

+0

'chr (0b100001)' должен ... но я не видел, что где-нибудь в вашем вопросе ... –

+0

Нет, потому что я искал, чтобы превратить его в строку, а не только персонаж (который, я полагаю, я мог бы достичь по понятию списка?) В принципе, мой вопрос ... что лучший способ интерпретировать наименее значимые 12 бит целого числа python (и сколько бы нулей мне нужно для заполнения) в качестве строки ascii? –

Смежные вопросы