質問

okですので、私の問題は、文字列 '\ 222 \ 222 \ 223 \ 225'がデータベースにlatin-1として保存されていることです。 djangoから(印刷することで)取得できるのは、次の文字列 'ââââ¢'です。これはUTF変換だと思います。今、私は文字列を関数に渡す必要があります この操作を行います:

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

このエラーが表示されます:

  

chr()argがrange(256)にありません

最初に文字列をlatin-1としてエンコードしようとすると、次のエラーが表示されます:

  

'latin-1' codecは0〜3の位置の文字をエンコードできません:序数ではありません   範囲内(256)

文字エンコーディングの仕組みに関する記事を読みましたが、取得できないために不足しているものがあります!

役に立ちましたか?

解決

最初のエラー「chr()arg not in range(256)」は、おそらくchrが負の数を取ることができないため、値がアンダーフローしたことを意味します。 inputcounter + 33が実際の文字表現よりも大きい場合、暗号化アルゴリズムが何をするのかわからないので、その場合の対処方法を確認する必要があります。

2番目のエラーについて。データを適切に表現するには、通常の文字列オブジェクトをencode()ではなくdecode()する必要があります。 encode()は、Unicodeオブジェクト(u 'で始まるオブジェクト)を受け取り、出力またはファイルに書き込むための通常の文字列を生成します。 decode()は文字列オブジェクトを受け取り、対応するコードポイントを持つUnicodeオブジェクトを生成します。これは、文字列オブジェクトから生成されたunicode()呼び出しで行われます。代わりにa.decode( 'latin-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)

他のヒント

Vinkoが指摘しているように、Latin-1またはISO 8859-1には、引用する8進数文字列に印刷可能な文字がありません。 8859-1のメモによると、「C1 Controls(0x80-0x9F)」はISO / IEC 6429:1992のものです。 80、81、99 ''の名前は定義していません。コードポイント名は、Vinkoがリストしたとおりです。

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

これらの正しいUTF-8エンコーディングは(Unicode、バイナリ、16進数):

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

CIRCUMFLEXを使用したローマ字小文字AはISO 8859-1コード0xE2であるため、Unicode U + 00E2です。 UTF-8では、%11000011%10100010または0xC3 0xA2です。

CENT SIGNはISO 8859-1コード0xA2であるため、Unicode U + 00A2です。 UTF-8では、%11000011%10000010または0xC3 0x82です。

したがって、他に何が表示されていても、ISO 8859-1のUTF-8エンコーディングは表示されていないようです。それ以外はすべて、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の範囲にあることが保証されます。文字cとintCounterの値(および mod()関数は負の引数を取得しないため、引数が mod()の動作に関係なく動作します)負)。

それは、何らかのリクエストによってキャラクターのord()を変更するだけのひどいスキームで暗号化されているためです。データベースから出てくる文字列は暗号化され、これが解読されます。上記で提供したものは機能しないようです。データベースではlatin-1であるため、djangoはそれをUnicodeに変換しますが、Unicodeとして関数に渡すことはできませんが、latin-1にエンコードしようとするとエラーが表示されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top