2014-12-15 4 views
0

Я столкнулся с интересным поведением в индексировании строк Python, и я думаю, что это может быть ошибка.Ошибка индексации строки Python?

Цель моего кода, чтобы выполнить ряд манипуляций, чтобы превратить шестнадцатеричной строки в двоичные (12 бит) и взять подмножество (10 LSB) двоичной строки

Код, который дает мне результат ожидать, выглядит следующим образом:

def test (hex): 
    print (bin(int(hex,16))[2:].zfill(12)[3:12]) 

если вход "1", то есть шестигранные = "1"

bin(int(hex,16)) возвращает 0b1, как и ожидалось

bin(int(hex,16))[2:] избавляется от ведущих 0b и возвращает 1 - работает, как и ожидалось [2:] дают 3-й символ и onwords

bin(int(hex,16))[2:].zfill(12) возвращает 0000_0000_0001 («_» добавлена ​​для иллюстрации)

теперь приходит интересная часть для того, чтобы получить 10 LSB, то есть 3-го по 12-й гольца можно было бы использовать

bin(int(hex,16))[2:].zfill(12)[2,11]

однако, кажется, что я должен был использовать bin(int(hex,16))[2:].zfill(12)[3,12], чтобы получить 00_0000_0001, что, по-видимому, указывает на то, что индексирование стало 1 основано вместо 0 основано после .zfill(12)?

Результаты получают с Python 3.4.1

Любое предложение ценится!

Вот код теста:

def test (hex): 
    print (int(hex,16)) # bfn hex string to intege 
    print (bin(int(hex,16))) # integer to binary string "return 0b...." 
    print (bin(int(hex,16))[2:]) # get rid of the leading "0b" 
    print (bin(int(hex,16))[2:].zfill(12)) # fill the string to length of 12 bits 
    print (bin(int(hex,16))[2:].zfill(12)[3:12]) 

для теста:

test("1") 

выход:

1 
0b1 
1 
000000000001 
0000000001 
+0

как насчет знака? –

+1

Можете ли вы привести примеры ваших тестовых входов для воспроизведения нечетного поведения? Я чувствую, что вы можете использовать число, которое уже составляет 13 бит (поэтому zfill (12) не добавляет и не обрезает никакую цифру) – fortran

+0

вы предлагаете .zfill() внесла дополнительный бит знака (и он не виден в печати())? – haomin

ответ

0
>>> hex = "1" 
>>> bin(int(hex, 16)) 
'0b1' 
>>> bin(int(hex, 16))[2:] 
'1' 
>>> bin(int(hex, 16))[2:].zfill(12) 
'000000000001' 
>>> bin(int(hex, 16))[2:].zfill(12)[2:] 
'0000000001' 
>>> bin(int(hex, 16))[2:].zfill(12)[2:11] 
'000000000' 

Как вы можете видеть, используя кусочек 2:11 как индекс не включает символ nu mber 11 (12-й символ в строке). В индексировании строк Python нет ошибки.

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

+0

спасибо, но я думал, что с помощью индексации 2:11 СЛЕДУЕТ включать 12-й символ в строку (от 3-го до 12-го), так как [2: 0] дал строку, начиная с третьего символа (следовательно, на основе 0) – haomin

+0

Нет. Пока ни 'm', ни' n' больше, чем 'len (s)', то 'len (s [m: n])' всегда равно 'n - m'. См. [Документация по разрезанию] (https: //docs.python.орг/2/учебник/introduction.html # строки). – holdenweb

+0

ах да, вы абсолютно правы! все еще не используется в соглашении, Python предоставил, как полезен пропущенный второй индекс! благодаря! – haomin

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