【问题标题】:Read one double from base64 encoding in ruby从 ruby​​ 中的 base64 编码读取一个 double
【发布时间】:2026-01-08 22:50:01
【问题描述】:

如何从 base64 编码的字符串中读取一个值? 例如,如果我有一个数组:

part = [1.2222,1.3333]

然后我将这个数组转换为二进制表示,如下所示:

bin =  part.pack('G*')

然后:

base64 = Base64.encode64 bin

输出是这样的:

base64 ="P/OOIZZSvTw/9VUyYXwb2g==\n"

那么我怎样才能读取这种格式的第一个值,以确保我不会错过等效值中的任何字符?

目标是在一个限制和偏移之后做。

【问题讨论】:

    标签: ruby string base64 limit


    【解决方案1】:

    完全相反:解码 base64 字符串,使用相同格式字符解压一个值(不带* 只得到一个值)

    base64 = "P/OOIZZSvTw/9VUyYXwb2g==\n"
    base64.unpack('m')[0].unpack('G')[0]
    # => 1.2222
    

    Base64.decode64(base64).unpack('G')[0]
    # => 1.2222
    

    【讨论】:

    • 谢谢,但我无法解压。我只想将字符串读取为等效值。问题是我不知道有多少个字符代表一个值,你明白吗?
    • @user6776, Single G pack 生成 8 字节字符串。并且 base64 编码使字符串的 3/2 长度。 (忽略填充,奇数字符串的问题)
    • @user6776,所以你可以使用类似:base64[0, 12].unpack('m')[0].unpack('G')[0]
    • 如果我错了,请纠正我,你是说字符串中的前 12 个字符代表“浮点数”吗?
    • @user6776,是的,我是。试试[[1.2222].pack('G')].pack('m').size(你需要减去1来排除换行符)。或[[1.2222].pack('G')].pack('m').chomp.size