如何将数字中的字节转换为字符串?(数字的字符表示)

Ara*_*lox 5 ruby string hex character type-conversion

如何通过将数字分成连续的字节来轻松地将数字(例如0x6162636382179以 10 为基数)转换为字符串?所以上面的例子应该转换成'abc'.

我已经尝试过Array.pack但无法弄清楚如何让它转换数字中的多个字节,例如[0x616263].pack("C*")returns 'c'。我也尝试过0x616263.to_s(256),但这会引发 ArgumentError: invalid radix. 我想它需要某种编码信息?

(注意:pack 中的其他数据类型类似于N我上面给出的示例,但只是因为它适合 4 个字节,所以例如[0x616263646566].pack("N")给出cdef,而不是abcdef

这个问题有点类似于这个问题和这个问题,但又不完全一样。另外,我还想出了如何使用 来从字符串中获取十六进制表示字符串"abcde".unpack("c*").map{|c| c.to_s(16)}.join(""),它给出了'6162636465'。我基本上想倒退。

我不认为这是一个XY 问题,但如果是的话 - 我正在尝试将用 RSA 解码的数字转换为字符串。

谢谢你的帮助。我对 Ruby 不太有经验。我也对 Python 解决方案感兴趣(为了好玩),但我不知道为这个问题添加两种单独的编程语言的标签是否正确。

Nat*_*han 5

要将单个数字转换0x00616263为 3 个字符,您首先需要做的就是将它们分成三个数字:0x000000610x000000620x00000063

对于最后一个数字,您想要的十六进制数字已经位于正确的位置。但对于另外两个,你必须使用进行位移>> 16和进行位移>> 8

然后,使用按位 and 去掉其他数字:

num1 = (0x616263 >> 16) & 0xFF
num2 = (0x616263 >> 8) & 0xFF
num3 = 0x616263 & 0xFF
Run Code Online (Sandbox Code Playgroud)

对于角色,你可以这样做:

char1 = ((0x616263 >> 16) & 0xFF).chr
char2 = ((0x616263 >> 8) & 0xFF).chr
char3 = (0x616263 & 0xFF).chr
Run Code Online (Sandbox Code Playgroud)

当然,按位运算并不是很 Ruby 风格。其他人可能会提供更多类似 Ruby 的答案。


Ara*_*lox 2

我目前正在处理这个:

n = 0x616263

nhex = n.to_s(16)
nhexarr = nhex.scan(/.{1,2}/)
nhexarr = nhexarr.map {|e| e.to_i(16)}

out = nhexarr.pack("C*")
Run Code Online (Sandbox Code Playgroud)

但希望有一种简洁/内置的方法来做到这一点,所以我暂时不接受这个答案。