Vinkoが指摘しているように、Latin-1またはISO 8859-1には、引用する8進文字列の印刷可能な文字がありません。8859-1に関する私のメモによると、「C1コントロール(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、binary、hex)です:
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または0xC30xA2です。
CENTSIGNはISO8859-1コード0xA2であるため、Unicode U+00A2です。UTF-8では、%11000011%10000010または0xC30x82です。
したがって、他に表示されているものが何であれ、ISO8859-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()
が正であり、任意の入力文字cおよびintCounterの任意の値に対して0..255の範囲にあることが保証されます(および、mod()
関数のため負の引数を取得することはありませんmod()
。引数が負の場合の動作に関係なく機能します)。