2010-01-03 2 views
-3

Я новичок в Python и программирования,все возможные комбинации для HEX значения из заданного набора символов

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

позволяет сказать, что он имеет значение: 0x50158A51

это 4 байта (32 бит) шестнадцатеричное значение

теперь мне нужно найти значение, которые, когда добавляются или вычитаются (из предоставленного набора) закончится этим результатом.

, например:

0x75612171 + 0x75612171 + 0x6553476F = 0x50158A51

  • уведомление о том, что значения добавляются все из разрешенного набора

Просто чтобы быть ясно, у меня есть ограниченные символы комплект

который есть:

\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13 
\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26 
\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39 
\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c 
\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f 
\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72 
\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85 
\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98 
\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab 
\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe 
\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1 
\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4 
\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7 
\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff 

я использовал простой код для вычисления 3 значения:

#!/usr/bin/python 

hex1 = 0x55555521 
hex2 = 0x55555421 
hex3 = 0x6D556F49 

calc = hex1 + hex2 + hex3 
print hex(calc) 

который даст результат:

[email protected]:~# ./calc2.py 
0x150158a51 

мне нужно некоторые как обратный процесс ответа путем размещения отклонения от мой позволил установить в переменные

, например:

укладки 4 байта шестнадцатеричных значений из набора в переменные

try: 

hex1 = placing 4bytes from allowed set 
hex2 = placing 4bytes from allowed set 
hex3 = placing 4bytes from allowed set 

if result (hex1+hex2+hex3) = 0x150158a51 
then 
print "values used for this results are: hex1 hex2 hex3" 

Благодарим вас заблаговременно.

+1

Возможно, вы захотите отметить это как домашнюю работу (это звучит так) – Uri

+0

Описание проблемы непонятно. Шары не существуют в python, кроме как элементов строк, которые нельзя вычесть. Более того, ваша математика в примере ошибочна. 'hex (0x7612171 + 0x75612171 + 0x6553476F) == '0xe2158a51L''. Можете ли вы объяснить, что вы на самом деле пытаетесь сделать? Кроме того, если вы можете создать код python, который будет представлять ваши лучшие усилия, чтобы делать то, что вы описали, это также поможет. – jcdyer

+0

@jcd Пример верен, если вы отбрасываете биты более высокого порядка и рассматриваете их как неподписанные значения. См., Например, http://www.wolframalpha.com/input/?i=0x75612171+%2B+0x75612171+%2B+0x6553476F (обратите внимание на переполнение). –

ответ

1

То, о чем вы просите, не представляется возможным. Будут бесконечные последовательности чисел, которые при добавлении вместе будут продолжать производить тот же результат по модулю 2^32.

Как тривиальный пример, скажем, что ваш целевой номер равен 0x10000000, и только шестнадцатеричные значения, которые вы разрешаете, равны нулю и единицам. Затем следующие последовательности чисел приведут к 0x10000000:

0x1 + 0x1 + ... + 0x1 (0x10000000 times) = 0x10000000 
0x1 + 0x1 + ... + 0x1 (0x110000000 times) = 0x10000000 
0x1 + 0x1 + ... + 0x1 (0x210000000 times) = 0x10000000 

и так далее. Поскольку вы можете продолжать добавлять 0x1 неограниченно, алгоритм никогда не может прекратиться.

+0

Спасибо за быстрый ответ, Что мне нужно сделать, используя скрипт python, - найти, какая комбинация приведет к этому значению: 0x50158A51 Мне, вероятно, не нужны все комбинаторы только один из моего набора char у вас есть другая идея как я могу это достичь? – Shai

+0

Все комбинации, предоставленные Джоном, взяты из вашей кодировки. Какой из них нет? –

+0

Это плохие значения (символы): \ x80 ',' \ x81 ',' \ x82 ',' \ x83 ',' \ x84 ',' \ x85 ',' \ x86 ',' \ x87 ',' \ x88 ',' \ x89 ',' \ x8a ',' \ x8b ',' \ x8c ', \t' \ x8d ',' \ x8e ',' \ x8f ',' \ x90 ',' \ x91 ',' \ x92 ',' \ x93 ',' \ x94 ',' \ x95 ',' \ x96 ',' \ x97 ',' \ x98 ',' \ x99 ', \t' \ x9a ' , '\ x9b', '\ x9c', '\ x9d', '\ x9e', '\ x9f', '\ xa0', '\ xa1', '\ xa2', '\ xa3', '\ xa4' , '\ xa5', '\ xa6', – Shai

1

Следующая программа для 0x50158A51 генерирует:

0x50157f51 + 0x00000b00 + 0x00000000 = 0x50158A51 

для 0x1090F0FF он генерирует:

0x107f7f7f + 0x000011717f + 0x00000001 = 0x1090f0ff 

, где все "герои" в слагаемых из разрешенного набора, а не из запрещенную набора.

Программа:

a=0x1090F0FF 

a0=0 
a1=0 
a2=0 
for n in range(3,-1,-1): 
    a0<<=8; 
    a1<<=8; 
    a2<<=8; 
    mask = 0xff<<(n*8) 
    b=(a&mask)>>(n*8) 
    if b > 2*0x7f: 
     a0 += 0x7f 
     a1 += 0x7f 
     a2 += b - 2*0x7f 
    elif b > 0x7f: 
     a0 += 0x7f 
     a1 += b - 0x7f 
    else: 
     a0 += b 

print '%08x + %08x + %08x = %08x' % (a0, a1, a2, a0+a1+a2) 
0

Из того, что я понял, но я могу ошибаться, вы говорите о вариации Subset Sum Problem, которая является NP-полной. Поэтому вы можете найти дополнительную информацию об этом.

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