9

我有一个长度为一个字符的字符串,可以是任何可能的字符值:

irb(main):001:0> "\x0"
=> "\u0000"

我认为这可能有效:

irb(main):002:0> "\x0" += 1
SyntaxError: (irb):2: syntax error, unexpected tOP_ASGN, expecting $end
"\x0" += 1
        ^            from /opt/rh/ruby193/root/usr/bin/irb:12:in `<main>'

但是,正如你所看到的,它没有。如何增加/减少我的角色?


编辑:

Ruby 似乎没有设置为执行此操作。也许我以错误的方式接近这个。我想以 8 位块的形式操作原始数据。我怎样才能最好地完成这种操作?

4

4 回答 4

23

根据可能的值,您可以使用String#next

"\x0".next
# => "\u0001"

或者,要更新现有值:

c = "\x0"
c.next!

这可能不是您想要的:

"z".next
# => "aa"

我能想到的增加字符底层代码点的最简单方法是:

c = 'z'
c = c.ord.next.chr
# => "{"

递减稍微复杂一些:

c = (c.ord - 1).chr
# => "z"

在这两种情况下,都假设您不会走出0..255; 您可能需要为此添加检查。

于 2013-08-02T00:00:43.440 回答
3

你不能这样做:

"\x0" += 1

因为,在 Ruby 中,它是:

"\x0" = "\x0" + 1

将值分配给字符串文字是语法错误。

但是,给定一个整数n,您可以使用 将其转换为字符pack。例如,

[97].pack 'U' # => "a"

同样,您可以使用 将字符转换为整数ord。例如:

[300].pack('U').ord # => 300

使用这些方法,您可以轻松编写自己的增量函数,如下所示:

def step(c, delta=1)
  [c.ord + delta].pack 'U'
end

def increment(c)
  step c, 1
end

def decrement(c)
  step c, -1
end

如果你只想操作字节,你可以使用String#bytes,它会给你一个整数数组来玩。您可以使用Array#pack将这些字节转换回字符串。(有关编码选项,请参阅文档。)

于 2013-08-02T00:22:29.213 回答
1

您可以使用该String#next方法。

于 2013-08-02T00:01:20.117 回答
0

我认为最优雅的方法(对于字母数字字符)是:

"a".tr('0-9a-z','1-9a-z0')

这会将 a 循环到 z 并通过数字并返回到 a。

我重读了这个问题,发现我的答案与问题无关。对于直接操作 8 位值,我没有答案。

于 2015-11-18T11:14:59.193 回答