【问题标题】:Converting int to escaped octal character将 int 转换为转义的八进制字符
【发布时间】:2013-10-16 15:59:44
【问题描述】:

给定一个整数——比如x=20,我想把它转换成一个包含转义八进制字符的字符串。 IE。 ...

x=20

# y = ... Some magic

p y # => "\024"

我设法得到的最接近的是使用:

x.to_s(8) # => "24"

但是,我完全不知道如何将此字符串转换为转义的八进制字符!任何想法,互联网?

【问题讨论】:

  • "\024".b 表示为"\x14",你想做什么?
  • 好的,那么如何将 20 转换为 "\x14"?再说一次,我只知道如何将其转换为“14”。
  • 我正在尝试做一些低级的数据包操作,这需要我输入某些字段作为转义的八进制值。
  • 您能说得更具体些吗?低级通常需要二进制值。
  • 我正在使用 packetfu,它(由于它的实现)要求我在这里使用八进制值....但是无论如何,我真的不明白我的应用程序是如何相关的!

标签: ruby int type-conversion octal


【解决方案1】:

只需使用Kernel#sprintf 格式化数字即可。

这样

x = 20
y = sprintf('\%03o', x)

puts y

输出

\024

更新

也许我误解了你。如果您只想要具有给定代码点的字符,则只需使用 Integer#chr

这样

x = 20
y = x.chr

p y

输出

"\x14"

【讨论】:

    【解决方案2】:

    你可以使用Array#pack:

    [20].pack("C")  #=> "\x14"
    

    【讨论】:

    • 使用packunpack 模拟Integer#chrString#split 等定制方法的功能是不正当的。
    • 我建议 pack 因为 OP 想做“低级”操作。
    【解决方案3】:
    x = 20
    
    y = '\%03o' % x
    
    puts y
    

    如果您使用 p 显示 y,您会看到 2 个反斜杠,因为 p 输出 ruby​​ 可解析字符串。

    【讨论】:

    • 谢天谢地,正如最重要的答案所注意到的那样,我幼稚的年轻自我并没有真正准确地指定这个问题:我想要的输出中的单个反斜杠不是错误;我真的很想要"\024"
    • 据我所知,正确的答案就是使用x.chr - 或者,一个更“通用”的问题解决方案(如果你需要它)是(小心!) :eval "?\\#{x.to_s(8)}",或eval "?\\x#{x.to_s(16)}"
    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    相关资源
    最近更新 更多