【问题标题】:Convert a string of integers to byte array in Ruby在 Ruby 中将整数字符串转换为字节数组
【发布时间】:2016-05-05 04:01:52
【问题描述】:

我有一个整数字符串“72101108108111”,但它是一个代表原始字符串“Hello”字节的字符串。

如何在 Ruby 中将“72101108108111”转换为 Ascii 字符串“Hello”?

【问题讨论】:

  • 你不能。无法判断第一个字节是7 还是72。如果我们猜对了72,则无法判断第二个字节是110 还是101,等等。然而,这个字符串是生成的,它并不是在考虑解码的情况下生成的。
  • 如果我们假设 2 个数字组成一个字节,我们能做到吗?即它的 72、10、11 等?
  • 那不会给你“你好”。 H 的 ASCII 码是 72,但 e 是 101。
  • 我需要将字符串编码/解码为 Base58。找到一个将整数转换为 Base58 的 gem。试图弄清楚我是否可以将字符串转换为字节,然后进行编码,反之亦然。
  • 将基本的 10 个 ASCII 码连接成一串数字并不是“将字符串转换为字节”的正确方法。

标签: ruby string integer byte


【解决方案1】:

按照 cmets 中的说明回答您的问题(与标题无关):

我需要将字符串编码/解码为 Base58

编辑:现在作为一个类(使用 base58 gem):

require 'base58'

class Base58ForStrings
  def self.encode(str)
    Base58.encode(str.bytes.inject { |a, b| a * 256 + b })
  end

  def self.decode(b58)
    b = []
    d = Base58.decode(b58)
    while (d > 0)
      d, m = d.divmod(256)
      b.unshift(m)
    end
    b.pack('C*').force_encoding('UTF-8')
  end
end

Base58ForStrings.encode('Hello こんにちは')
# => "5scGDXBpe3Vq7szFXzFcxHYovbD9c" 
Base58ForStrings.decode('5scGDXBpe3Vq7szFXzFcxHYovbD9c')
# => "Hello こんにちは"

适用于任何 UTF-8 字符串。

【讨论】:

  • 感谢您的帮助。我如何从“9aJCVZR”中获得“Hello”?解码会给我整数。
【解决方案2】:
s = '72101108108111'
pattern=/^[a-zA-Z]/
index,res=0,''
while index<s.size
  len=0
  while (s[index..index+len].to_i.chr=~pattern).nil?
    len+=1
  end
  res << s[index..index+len].to_i.chr
  index+=len+1
end

p res

试试这个,因为每个要解码的字符串的长度是不确定的。

例如,"72-&gt;'H' , 101-&gt;'e' , 23-&gt;'\x17'"

所以每次我们发现解码的字符不是"a~z" or "A~Z" (ex:\x17)

我们只是添加长度并解析,直到找到我们想要的字符

对于这种情况,答案将是正确的"Hello"

在某些情况下它可能会出现故障,但它现在可以很好地用于我的测试

随便看看

只有在只包含“A-Z and a-z”的情况下才有效

【讨论】:

  • 只有英文字符的情况下独有,切记!
猜你喜欢
  • 2016-01-18
  • 1970-01-01
  • 2010-10-21
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 2014-10-31
  • 2023-04-09
相关资源
最近更新 更多