對不起,這個任務中的字符混亂。在我的腳本中,我像這樣壓縮和異或資料
buff2 = Deflate.deflate(buff)
buff3 = ''
buff2.each_char do |c|
buff3 << (c.chr.ord ^ 0xFF)
end
解壓后的字串是這樣的
x??=?0 @?=??<38?k7l?v?Х?H?!??rwZ????p ??8#??;?ZDS)}0?b??J?s?qz>????? ?D?? "???]??I8dS2??????e_???~???
異或之后
ca4??=?ó??Xw?ì?Nèw/Zà·sT?hW¥YHC???ü{j?¥??à??z} áé@rù?;@?^ ??YùrR¢V~???íD0 $@Y ^FaW
但是,當我嘗試反轉 XOR(以相同的方式)時,字串看起來確實相似,但它缺少 ? 字串看起來像這樣
2x?=?0 @á=§<38±k7lvèD¥?H!¨rwZ|·??p ?t8#;?ZDS)}0 béJ?sqz>??í? ??D?? "ú-]?I8dS2??°?ó??|e_?1?~àè¨
我試圖用 zlib 給它充氣,但它失敗了incorrect header check (Zlib::DataError)
我在做什么將 s 更改為實際的字串?
uj5u.com熱心網友回復:
通過 創建字串時'',encoding默認為 UTF-8: (或更準確地說是您的腳本編碼)
buff3 = ''
buff3.encoding
#=> #<Encoding:UTF-8>
這使得<<將值解釋為 Unicode 代碼點(這可能導致多個位元組)
str = ''
str << 200 #=> "è"
str.codepoints #=> [200]
str.bytes #=> [195, 136]
如果你想處理位元組,你應該使用二進制編碼,例如通過String#b或String::new:
str = ''.b
str.encoding
#=> #<Encoding:ASCII-8BIT>
str = String.new
str.encoding
#=> #<Encoding:ASCII-8BIT>
在二進制編碼字串中,代碼點等于位元組:(非 ASCII 位元組呈現為\xnn)
str = String.new
str << 200 #=> "\xC8"
str.codepoints #=> [200]
str.bytes #=> [200]
此外,您可以使用each_byte碰巧已經回傳數值的基于位元組的方法:(因此您不必通過 轉換它們ord)
buff2.each_byte do |b|
buff3 << (b ^ 0xFF)
end
或者,您可以使用packand unpack:
str = 'foobar'
enc = str.unpack('C*').map { |b| b ^ 0xff }.pack('C*')
#=> "\x99\x90\x90\x9D\x9E\x8D"
dec = enc.unpack('C*').map { |b| b ^ 0xff }.pack('C*')
#=> "foobar"
C表示“8 位無符號”并*表示多次出現。
如果您只想翻轉位,還有Integer#~:
[102].map { |b| b ^ 0xff } #=> [153]
[102].map { |b| ~b } #=> [153]
[102].map(&:~) #=> [153]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/484985.html
