【问题标题】:Number of bytes in encoded hex string编码的十六进制字符串中的字节数
【发布时间】:2011-12-12 01:23:28
【问题描述】:

这可能是一个简单的问题,但我正在尝试查看编码和字节(我有一段时间没看过)以实现二进制协议。

看起来普通字符是 1 个字节。但是当你用十六进制编码它们时,它的字节数减半。

ruby-1.9.2-p180 :001 > "abcd".bytesize
 => 4 
ruby-1.9.2-p180 :002 > ["abcd"].pack("H*")
 => "\xAB\xCD" 
ruby-1.9.2-p180 :003 > ["abcd"].pack("H*").bytesize
 => 2 

我也期待十六进制编码会出现字符 0-9 和 A-F

有人可以帮助澄清这里发生了什么吗?而且,如果您能指出我对在线编码的一般性很好的评论,我很乐意复习。我还没有看到任何简单的概述,这会很棒。

谢谢!

【问题讨论】:

  • 看来你实际解码而不是十六进制编码为abcd(四个字节)十六进制是171, 205(两个字节)十进制。
  • 你想做什么?用十六进制表示每个字符的代码点?
  • 一个字符就是一个字节。十六进制数字 [0-9A-F] 是一个 nybble 或半字节。例如,FF hex 是一个字节的最大值。因此,您的发现是意料之中的:4 个字符的字符串是 4 个字节,而 ABCD 十六进制是两个字节,ABCD

标签: ruby encoding binary hex


【解决方案1】:

#pack 读取给定的字符串并根据给定的格式将其转换为二进制。 pack('H*') 表示您给出的字符串表示十六进制表示法,因此它将字节 ABCD 从十六进制转换为二进制(1010 1011 1100 1101),即两个字节。

尝试["g"].pack("H*"),其中g 不是有效的十六进制字符...

【讨论】:

  • 我想我现在看到了我的困惑——“abcd”实际上是一个十六进制字符串,它正在转换为二进制。我以为我正在使用常规字符串并将其转换为十六进制。 :/ 感谢您的帮助!
猜你喜欢
  • 2011-10-02
  • 2014-03-10
  • 2020-03-04
  • 2019-07-27
  • 1970-01-01
  • 2020-11-11
  • 2018-03-20
  • 1970-01-01
  • 2013-08-09
相关资源
最近更新 更多