2011-01-18 26 views
6

Hi là có bất kỳ chức năng bản địa (không cài đặt đá quý khác, hoặc không gọi openssl từ vỏ) để nén chuỗi hoặc mã hóa một chuỗi?phương pháp ruby ​​gốc để nén/mã hóa chuỗi?

loại như nén mysql.

"a very long and loose string".compress
output = "8d20\1l\201"

"8d20\1l\201".decompress
output = "a very long and loose string"?

và tương tự như vậy để mã hóa một số chuỗi?

Trả lời

14

Từ http://ruby-doc.org/stdlib/libdoc/zlib/rdoc/classes/Zlib.html

# aka compress 
    def deflate(string, level) 
    z = Zlib::Deflate.new(level) 
    dst = z.deflate(string, Zlib::FINISH) 
    z.close 
    dst 
    end 

    # aka decompress 
    def inflate(string) 
    zstream = Zlib::Inflate.new 
    buf = zstream.inflate(string) 
    zstream.finish 
    zstream.close 
    buf 
    end 

Encryption từ http://snippets.dzone.com/posts/show/991

require 'openssl' 
require 'digest/sha1' 
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc") 
c.encrypt 
# your pass is what is used to encrypt/decrypt 
c.key = key = Digest::SHA1.hexdigest("yourpass") 
c.iv = iv = c.random_iv 
e = c.update("crypt this") 
e << c.final 
puts "encrypted: #{e}\n" 
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc") 
c.decrypt 
c.key = key 
c.iv = iv 
d = c.update(e) 
d << c.final 
puts "decrypted: #{d}\n" 
+0

Theo tài liệu Zlib, 'Zlib :: Deflate.deflate (chuỗi [, mức độ])' và 'Zlib :: Thổi phồng .inflate (string [, level]) 'là" gần như tương đương "với các phương pháp deflate/inflate ở trên. –

5

OpenSSLZlib. Có một ví dụ về cách sử dụng OpenSSL trong this question.

+2

Không phải là bạn thực sự bao hàm bất kỳ thứ tự hoạt động nhưng ai được tỷ lệ nén tốt hơn nếu văn bản đầu tiên được nén và sau đó mã hóa. –

+0

Bạn sẽ hầu như không bị nén nếu tệp được mã hóa lần đầu tiên. Đọc này: https://blog.appcanary.com/2016/encrypt-or-compress.html – JLB

Các vấn đề liên quan