Ruby Marshal 转储规则

时间:2021-07-06 18:37:08

标签: ruby

我使用这个 ruby​​ 代码生成了一个 .rxdata 文件

class A < Array
  def initialize
    @a = Object.new
    @b = :b
    @c = @a
    @d = @b
    @e = Object.new
  end
end


str = Marshal.dump( A.new )

file = File.open("./users.rxdata", "w")
file.write str
file.close

这是生成的字节码

04 08 49 43 3A 06 41 5B 00 [0D] 0A 3A 07 40 61 6F   ..IC:.A[...:.@ao
3A 0B 4F 62 6A 65 63 74 00 3A 07 40 62 3A 06 62     :.Object.:.@b:.b
3A 07 40 63 40 06 3A 07 40 64 3B 09 3A 07 40 65     :.@c@.:.@d;.:.@e
6F 3B 07 00                                         o;..


但是索引 9 中有一个意外的 0D 字节。0D 在这里的作用是什么?

红宝石版本:

>ruby.exe --version
ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x64-mingw32]

1 个答案:

答案 0 :(得分:1)

我在 dump_spec.rb 中找到了此代码 p "\004\bi\n".unpack("H*").first

所以我打印了 "0408690a" 结果是 File.open("./users2.rxdata", "w") { |file| file.write("\004\bi\n") }

我把它写入文件

04 08 69 0D 0A

并检查字节码为 0D

这里的 str = Marshal.dump( 5 ) File.open("./users.rxdata", "w") {|file| file.write(str) } 被解释为 ASCII 控制字符 (0x00-0x1F)“回车”

所以当你执行这段代码时

04 08 69 0D 0A

会发现你的字节码变成这样 df_item_in_desc = pd.DataFrame(columns = df.columns) # to hold all satisfied results for index in df.shape[0]: s1 = set(df.iloc[index]['desc_words_short']) if item_number in s1: df_item_in_desc = df_item_in_desc.append(df.iloc[index])

如何在写入文件时忽略 ASCII 控制字符

相关问题