سؤال

وطيب حتى قضيتي هي لدي سلسلة '\ 222 \ 222 \ 223 \ 225 "التي يتم تخزينها كما اللاتينية-1 في ديسيبل. ما يحصل من جانغو (عن طريق طباعته) هو السلسلة التالية، "AAAA ¢ 'الذي افترض هو تحويل UTF منه. الان انا بحاجة لتمرير السلسلة إلى وظيفة أن هل هذه العملية:

strdecryptedPassword + chr(ord(c) - 3 - intCounter - 30)

وأحصل على هذا الخطأ:

<اقتباس فقرة>   

ومركز حقوق الإنسان () ARG ليس في النطاق (256)

إذا وأنا أحاول أن ترميز سلسلة ك اللاتينية-1 لأول مرة أحصل على هذا الخطأ:

<اقتباس فقرة>   

والترميز "اللاتينية-1" لا يمكن ترميز الحروف في موقف 0-3: ترتيبي لا   في مجموعة (256)

ولقد قرأت مجموعة على كيفية عمل ترميز الأحرف، وليس هناك شيء أنا في عداد المفقودين لأنني فقط لا تحصل عليه!

هل كانت مفيدة؟

المحلول

ولديك الخطأ الأول "مركز حقوق الإنسان () ARG ليس في النطاق (256)" ربما يعني أنك قد underflowed قيمة، لأن مركز حقوق الإنسان لا يمكن أن الأرقام السالبة. أنا لا أعرف ما يفترض خوارزمية التشفير للقيام عندما inputcounter + 33 هي أكثر من التمثيل الطابع الفعلي، سيكون لديك للتحقق ما يجب القيام به في هذه الحالة.

وعن الخطأ الثاني. يجب فك () وليس ترميز () كائن سلسلة منتظمة للحصول على التمثيل الصحيح للبيانات الخاصة بك. ترميز () يأخذ كائن يونيكود (تلك التي بدأت مع ش ') ويولد سلسلة منتظمة ليكون الناتج أو مكتوبة إلى ملف. فك شفرة () يأخذ كائن سلسلة وإنشاء كائن يونيكود مع نقاط الترميز المقابلة. ويتم ذلك مع الدعوة يونيكود () عندما ولدت من كائن سلسلة، هل يمكن أن ندعو أيضا a.decode ( 'اللاتيني-1') بدلا من ذلك.

>>> a = '\222\222\223\225'
>>> u = unicode(a,'latin-1')
>>> u
u'\x92\x92\x93\x95'
>>> print u.encode('utf-8')
ÂÂÂÂ
>>> print u.encode('utf-16')
ÿþ
>>> print u.encode('latin-1')

>>> for c in u:
...   print chr(ord(c) - 3 - 0 -30)
...
q
q
r
t
>>> for c in u:
...   print chr(ord(c) - 3 -200 -30)
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: chr() arg not in range(256)

نصائح أخرى

وكما يلاحظ فينكو واللاتينية-1 أو ISO 8859-1 لم يكن لديك طبع الحروف لسلسلة ثماني أقتبس لكم. وفقا لملاحظاتي عن 8859-1 "الضوابط C1 (0x80 - 0x9F) هي من ISO / IEC 6429: 1992 ولا يعرف أسماء 80، 81، أو 99". أسماء نقطة رمز هي كما يسرد فينكو لهم:

\222 = 0x92 => PRIVATE USE TWO
\223 = 0x93 => SET TRANSMIT STATE
\225 = 0x95 => MESSAGE WAITING

ووالصحيح UTF-8 ترميز تلك هي (يونيكود، ثنائي، عرافة):

U+0092 = %11000010 %10010010 = 0xC2 0x92
U+0093 = %11000010 %10010011 = 0xC2 0x93
U+0095 = %11000010 %10010101 = 0xC2 0x95

وحرف صغير اللاتينية مع المنعطف هو ISO 8859-1 كود 0xE2 وبالتالي يونيكود U + 00E2. في UTF-8، وهذا هو٪ 11000011٪ 10100010 أو 0xC3 0xA2.

وعلامة CENT هو 8859-1 كود ISO 0xA2 وبالتالي يونيكود U + 00A2. في UTF-8، وهذا هو٪ 11000011٪ 10000010 أو 0xC3 0x82.

وهكذا، أي شيء آخر كنت ترى، لا يبدو أن رؤية ترميز UTF-8 من ISO 8859-1. كل شيء على حدة، كنت ترى ولكن 5 بايت حيث سيكون لديك لمعرفة 8.

واضاف : الجزء السابق من الإجابة يتناول المطالبة "UTF-8 الترميز، ولكن يتجاهل بقية السؤال الذي يقول:

Now I need to pass the string into a function that does this operation:

    strdecryptedPassword + chr(ord(c) - 3 - intCounter - 30)

I get this error: chr() arg not in range(256).  If I try to encode the
string as Latin-1 first I get this error: 'latin-1' codec can't encode
characters in position 0-3: ordinal not in range(256).

وأنت لا تظهر في الواقع لنا كيفية تعريف intCounter، ولكن إذا فإنه بزيادة بلطف لكل حرف، عاجلا أم آجلا "ord(c) - 3 - intCounter - 30" ستكون سلبية (وبالمناسبة، لماذا لا تجمع بين الثوابت واستخدام 'ord(c) - intCounter - 33 ؟)، وعند هذه النقطة، ومن المرجح أن يشكو chr(). سوف تحتاج إلى إضافة 256 إذا كانت قيمة سلبية، أو استخدام عملية معامل لضمان أن يكون لديك قيمة موجبة بين 0 و 255 لتمريرها إلى chr(). وبما أننا لا نستطيع أن نرى كيف يتم زيادة intCounter، لا يمكننا معرفة ما إذا كان دورات 0-255 أو ما إذا كان يزيد مفردة النغمة. إذا كان هذا الأخير، فأنت بحاجة تعبير مثل:

chr(mod(ord(c) - mod(intCounter, 255) + 479, 255))

وحيث 256-33 = 223، وبطبيعة الحال، و 479 = 256 + 223. وهذا يضمن أن القيمة التي تم تمريرها إلى chr() موجبة وفي نطاق 0..255 لأي ج حرف إدخال وأي قيمة intCounter (و ، لأن وظيفة mod() لم يحصل حجة سلبية، كما أنها تعمل بغض النظر عن كيف يتصرف mod() عندما حججها سلبية).

حسنا، ذلك لأن لها تم تشفيرها مع بعض مخطط الرهيب الذي يتغير فقط أورد () من حرف بعض الطلب، وبالتالي فإن سلسلة يخرج من قاعدة بيانات تم تشفيرها وهذا يفك شفرة ذلك. ما قمت بتوفيرها أعلاه لا يبدو قادرا على العمل. في قاعدة البيانات هو اللاتينية-1، جانغو تحولها إلى يونيكود، ولكن لا أستطيع نقله إلى وظيفة كما يونيكود، ولكن عندما أحاول وصياغته إلى اللاتينية-1 أرى أن الخطأ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top