Ruby中如何将十六进制字符串转换为对应十六进制字节(UDP场景)
解决方案:将十六进制字符串转换为Ruby中的字节序列
别担心,这个问题其实Ruby自带的方法就能轻松解决,不用依赖任何外部库。你遇到的核心问题是:想要把拼接出来的十六进制字符串(比如"c56b40...")转换成对应的二进制字节,而不是把每个字符转成它的ASCII十六进制值。
正确的实现方式
Ruby的Array#pack方法里的'H*'格式符正好是干这个的——它会把一个十六进制字符串直接转换成对应的二进制字节序列。具体步骤如下:
- 先把所有十六进制片段拼接成一个完整的十六进制字符串(这一步你已经在做了);
- 用
[完整十六进制字符串].pack('H*')将其转换为二进制字节; - 直接写入文件就能得到你想要的十六进制字节内容。
完整代码示例:
a = "12" b = "15" # 拼接成完整的十六进制字符串(和你原来的逻辑一致) hex_string = "c56b4040003300" + a + "800401" + b + "90000000" # 关键:将十六进制字符串转换为二进制字节 header_bytes = [hex_string].pack('H*') # 写入文件验证效果 File.write('udp_packet.bin', header_bytes)
为什么之前的方法不行?
你尝试的"\xc5\x6b..." + a + "..."写法报错,是因为Ruby的字符串转义(比如\xc5)是在代码编译阶段就处理的,没办法在运行时把变量a的值(比如"12")当成转义的一部分。而pack('H*')是在运行时处理字符串,完美适配你用变量拼接十六进制片段的场景。
验证效果
运行上面的代码后,用十六进制编辑器打开udp_packet.bin,就能看到你想要的内容:
c5 6b 40 40 00 33 00 12 80 04 01 15 90 00 00 00
内容的提问来源于stack exchange,提问作者Mtoy
相关产品推荐
相关产品推荐

