Ara*_*lox 5 ruby string hex character type-conversion
如何通过将数字分成连续的字节来轻松地将数字(例如0x616263,6382179以 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 解决方案感兴趣(为了好玩),但我不知道为这个问题添加两种单独的编程语言的标签是否正确。
要将单个数字转换0x00616263为 3 个字符,您首先需要做的就是将它们分成三个数字:0x00000061、0x00000062和0x00000063。
对于最后一个数字,您想要的十六进制数字已经位于正确的位置。但对于另外两个,你必须使用进行位移>> 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 的答案。
我目前正在处理这个:
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)
但希望有一种简洁/内置的方法来做到这一点,所以我暂时不接受这个答案。
| 归档时间: |
|
| 查看次数: |
2084 次 |
| 最近记录: |