Ruby中如何用unpack将十六进制字符串转为8位有符号整数?
如何在Ruby中将十六进制字符串转换为8位有符号整数
嘿,我刚好能帮你搞定这个问题!你想要把十六进制字符串(比如"0xff")转成8位有符号整数,期望得到[-1]的结果,其实不用自己写复杂的实现,用Ruby原生的pack和unpack组合就能优雅解决。
正确的实现方式
你之前直接对"0xff"调用unpack没成功,是因为unpack是用来解析二进制字节串的,而"0xff"是ASCII格式的十六进制字符串,得先把它转成二进制才行。具体代码如下:
"0xff".pack('H*').unpack('c') # 输出:[-1]
逐行解释
pack('H*'):把十六进制字符串转换成对应的二进制字节串。H*这个格式符的作用就是将高位在前的十六进制字符串打包成二进制数据。unpack('c'):把二进制字节串解析成8位有符号整数数组。这里的c代表有符号char类型,正好对应你要的8位有符号整数(范围是-128到127)。
如果只需要单个整数结果而不是数组,用unpack1更方便:
"0xff".pack('H*').unpack1('c') # 输出:-1
另一种思路:从整数转换
如果你已经把十六进制字符串转成了十进制整数(比如"0xff".to_i(16)得到255),也可以用简单的逻辑转成8位有符号整数:
value = "0xff".to_i(16) signed_value = value >= 128 ? value - 256 : value # signed_value 结果为 -1
但显然第一种pack+unpack的方式更简洁,完全是Ruby原生的优雅实现,符合你的需求~
内容的提问来源于stack exchange,提问作者fex
相关产品推荐
相关产品推荐

