gpt4 book ai didi

ruby - 在 ruby​​ 中,如何将字节的文本表示形式转换为字节?

转载 作者:数据小太阳 更新时间:2023-10-29 07:59:11 24 4
gpt4 key购买 nike

将字符串“FA”转换为 /xFA/ 的最佳方法是什么?明确地说,我不想将“FA”变成7065“FA”.to_i(16)

在 Java 中等价的是这样的:

byte b = (byte) Integer.decode("0xFA");

最佳答案

所以您使用的是 / 标记,但您实际上并不是在询问正则表达式,对吧?

我认为这可以满足您的需求:

['FA'].pack('H*')
# => "\xFA"

ruby stdlib 中没有实际的 byte 类型(我不认为?除非有一个我不知道的?),只有字符串,可以是任意数量的字节长(在这种情况下,一个)。单个“字节”在 ruby​​ 中通常表示为 1 字节长的字符串。 String 上的#bytesize 将始终以字节为单位返回长度。

"\xFA".bytesize
# => 1

您的示例本身恰好不是有效的 UTF-8 字符。根据您正在做的事情以及环境的设置方式,您的字符串可能最终会被默认标记为 UTF-8 编码。如果您正在处理二进制数据,并希望确保字符串被这样标记,您可能需要对其进行 #force_encoding 以确保。使用#pack 时不需要,结果应该已经标记为 ASCII-8BIT(它有 BINARY 的同义词,它基本上是使用的“空编码”在 ruby​​ 中用于二进制数据)。

['FA'].pack('H*').encoding
=> #<Encoding:ASCII-8BIT

但是,如果您正在处理包含二进制数据的字符串对象,而不是任何编码中的有效字符数据,了解您有时可能需要执行 str.force_encoding("ASCII- 8BIT")(或 force_encoding("BINARY"),同样的事情),以确保您的字符串未被标记为特定的文本编码,这会使 ruby​​ 在您尝试时提示如果它包含该编码的无效字节,则对其执行某些操作——或者在其他情况下,可能会做错事

实际上是一个正则表达式

好的,您确实需要一个正则表达式。所以我们必须获取我们创建的字符串,并将其嵌入到正则表达式中。这是一种方法:

representation = "FA"
str = [representation].pack("H*")
# => "\xFA"
data = "\x01\xFA\xC2".force_encoding("BINARY")
regexp = Regexp.new(str)
data =~ regexp
# => 1 (matched on byte 1; the first byte of data is byte 0)

你看我如何在 data 字符串上需要 force_encoding,否则 ruby​​ 会默认它是一个 UTF-8 字符串(取决于 ruby​​ 版本和环境设置),并提示那些字节不是有效的 UTF-8。

在某些情况下,您可能也需要显式设置正则表达式来处理二进制数据,docs假设您可以将第二个参数 'n' 传递给 Regexp.new 来执行此操作,但我从未这样做过。

关于ruby - 在 ruby​​ 中,如何将字节的文本表示形式转换为字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33347066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com