Ruby marshal 模块的奇怪问题

发布于 2024-10-12 06:02:41 字数 1345 浏览 6 评论 0原文

这是一个奇怪的问题。我有一个混搭对象(cookie),一个包含 2 个已进行 Base64 编码的对象的数组。我使用decode64 和 marshal.load 对其进行解码并正常返回数组。

现在我获取这个数组并 marshal.dump 它并将其与原始表示进行比较。 2 个编码不匹配。 EF 位于字符串末尾,ET 位于第二个字符串末尾。

奇怪的是,如果我使用 irb,它们会匹配。

相同版本的红宝石。我缺少什么?

#!/usr/bin/env ruby -v  

require "base64"  
require "cgi"  

cookie = "BAhbB2kHSSJFNThhYmY3ZjRiOWY0OTc4NjMxOTNhNTllMzQ1YjYxNTVlMGE2NTIzZDNjZmZmZDYxNWQwNTVhNmJkMzI0ZWIxYQY6BkVU"  
p Marshal.load(Base64.decode64(cookie))  
p Base64.decode64(cookie)  
p Marshal.dump([2, "58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a"])  

输出:

ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10.5.0]  
[2, "58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a"]  
"\x04\b[\ai\aI\"E58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a\x06:\x06ET"  
"\x04\b[\ai\aI\"E58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a\x06:\x06EF"

irb 输出:

ruby-1.9.2-p136 :001 > p Marshal.dump([2, "58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a"])  
"\x04\b[\ai\aI\"E58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a\x06:\x06ET"  
 => "\x04\b[\ai\aI\"E58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a\x06:\x06ET"  

This is a weird issue. I have a mashalled object(cookie), an array with 2 objects which has been base64 encoded. I decode this using decode64 and marshal.load it and get the array back fine.

Now I take this array and marshal.dump it and compare it to the original representation. The 2 encodings dont match. EF at the end of the string vs ET on the second.

Strangely enough they match if I use irb.

Same version of ruby. What am I missing?

#!/usr/bin/env ruby -v  

require "base64"  
require "cgi"  

cookie = "BAhbB2kHSSJFNThhYmY3ZjRiOWY0OTc4NjMxOTNhNTllMzQ1YjYxNTVlMGE2NTIzZDNjZmZmZDYxNWQwNTVhNmJkMzI0ZWIxYQY6BkVU"  
p Marshal.load(Base64.decode64(cookie))  
p Base64.decode64(cookie)  
p Marshal.dump([2, "58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a"])  

Output:

ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10.5.0]  
[2, "58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a"]  
"\x04\b[\ai\aI\"E58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a\x06:\x06ET"  
"\x04\b[\ai\aI\"E58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a\x06:\x06EF"

irb output:

ruby-1.9.2-p136 :001 > p Marshal.dump([2, "58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a"])  
"\x04\b[\ai\aI\"E58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a\x06:\x06ET"  
 => "\x04\b[\ai\aI\"E58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a\x06:\x06ET"  

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

北渚 2024-10-19 06:02:41

正如 freenode 上 ruby​​-lang 上的 rue 指出的那样,irb 与 script 中的编码存在差异。

脚本中的 foo.encoding -> #<编码:US-ASCII>
irb 中的 foo.encoding -> #

在脚本中添加以下魔术注释可解决问题

#encoding: utf-8

As rue on ruby-lang on freenode pointed out, there was a difference in the encoding in irb vs script.

foo.encoding in script -> #<Encoding:US-ASCII>
foo.encoding in irb -> #<Encoding:UTF-8>

adding the following magic comment to script resolves the issue

#encoding: utf-8

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文