【问题标题】:More elegant realization of packed ASCII algorithm in rubyruby中打包ASCII算法的更优雅实现
【发布时间】:2014-05-01 13:28:08
【问题描述】:

我需要解压压缩的 ASCII 字符串。算法如下:

  1. 获取 3 个压缩的 ASCII 字节,将它们放入 4 个 ASCII 字节。 (6 + 6 + 6 + 6 位在 3 字节到 4 字节)
  2. 对于每个字节,将第 6 位设置为第 5 位的补码。
  3. 对于每个字节将第 7 位重置为零。
  4. 重复接下来的 3 个打包字节。

我是 Ruby 新手,可能有更正确和优雅的方法来解决这个任务,而不是我的代码:

while i < pstr.length 
    parr = [pstr[0] & 0x3F, pstr[0]>>6 | ((pstr[1] << 2 ) & 0x3F),
            pstr[1]>>4 | ((pstr[2] << 4 ) & 0x3F),
            pstr[2]>>2]
    parr.collect! { |a| a | (~(a << 1) & 0x20) }        
    parr.collect! { |a| a & 0x7F }

    puts parr

    i += 3
end

更新1:感谢更正收集。

【问题讨论】:

  • 澄清一下:您的代码按预期工作(例如通过测试),但您需要 Ruby 习语或捷径方面的帮助?您能否在问题中添加一些测试输入和经过验证的输出,这会有所帮助。
  • @UriAgassi 正如我在文档中所读到的,Ruby 不支持打包/解包中的打包 ASCII 代码。
  • @NeilSlater 代码适用于我拥有的示例,但 ofc 有错误,只是想澄清一下我正确理解 Ruby 构造并且没有办法使用 Ruby 功能以更紧凑的方式解决这个问题。感谢您对收集的更正。
  • 您能提供几个测试样本吗?

标签: ruby algorithm


【解决方案1】:

虽然 ruby​​ 的 Array#packString#unpack 不直接支持 ASCII 打包和解包,但它们通过 pack('m')unpack('m') 支持 Base64。这可以帮助处理与转换为每个包含 8 个相关位的 3 个字节和每个包含 6 个相关位的 4 个字节之间的转换所涉及的位移。

这是packunpack 的开始实现,它有点像ruby 风格。 pack 对正好是 4 的倍数的字符串进行操作,删除任何余数。相反,unpack 每 3 个字符扩展为 4 个。

B64 = ('A'..'Z').to_a+('a'..'z').to_a+('0'..'9').to_a+%w(+ /) # Base64 alphabet
H64 = Hash[B64.zip(0..63)] # Hash character to index

# Translates every 4 characters to 3, drops any remainder
def pack( ascii )
    ascii.bytes.map { |b| B64[b&(b&0x40==0?0x3f:0x1f)] }.join.unpack('m')[0]
end

# Translates every 3 characters to 4
def unpack( bstr )
    [bstr].pack('m').chomp.split('').map do |c|
       ( (H64[c]|0x40) & (H64[c]&0x20==0?0x5f:0x3f) ).chr
    end.join
end

示例用法:

ascii_packed = pack('Hello World!')
puts ascii_packed.length # => 9
puts unpack( ascii_packed ) # => "HELLO WORLD!"

对于不熟悉 ASCII-pack 的人来说,这是一种“有损”压缩。超出范围0x20 &lt;= x &lt; 0x60 的ASCII 字符x 被转换为该范围内的字符。这就是为什么小写字母在打包/解包时会大写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 2018-06-27
    • 2011-09-08
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多