gpt4 book ai didi

Ruby - 将 "=="十六进制值与字符串进行比较

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

我基本上是在读取图片文件的标题并进行快速比较以查看它实际上是哪种文件。 BMP、GIF、PNG 都很容易,因为它们的标题分别包含 BM、GIF 和 PNG 以标识自己。 JPG 让我有点不知所措。

jpg 的前 3 个字节往往是 0xff\0xd8\0xff,无论我如何设置,我都无法通过简单的比较获得真实值。

我读取了前 4 个字节:

if data[0, 3] == "\xff\xd8\xff"
puts "This is a JPG"
end

我知道我很接近,但我就是无法让它发挥作用。请让我知道我在这里遗漏了什么。

注意:我知道有 gem 可以帮我做这件事,但我不想使用 gem。就这么简单。

最佳答案

这是一个字符编码问题。从 JPEG 读取前 4 个字节返回一个 ASCII 编码的字符串:

head = File.read("some.jpg", 4)
# => "\xFF\xD8\xFF\xE1"

head.encodig
# => #<Encoding:ASCII-8BIT>

另一方面,字符串是 UTF-8 编码的:

jpg_prefix = "\xff\xd8\xff"
# => "\xFF\xD8\xFF"

jpg_prefix.encoding
# => #<Encoding:UTF-8>

比较 UTF-8 和 ASCII 字符串没有按预期工作:

head[0,3] == jpg_prefix
# => false

您必须使用 String#force_encoding 显式设置编码:

jpg_prefix = "\xff\xd8\xff".force_encoding(Encoding::ASCII_8BIT)
# => "\xFF\xD8\xFF"

jpg_prefix.encoding
# => #<Encoding:ASCII-8BIT>

head[0,3] == jpg_prefix
# => true

连接使用 Integer#chr 创建的 ASCII 字符(如 Mario Visic 所建议)也有效:

jpg_prefix = 0xff.chr + 0xd8.chr + 0xff.chr
# => "\xFF\xD8\xFF"

jpg_prefix.encoding
# => #<Encoding:ASCII-8BIT>

或使用 Array#pack :

jpg_prefix = ["FFD8FF"].pack("H*")
# => "\xFF\xD8\xFF"

jpg_prefix.encoding
# => #<Encoding:ASCII-8BIT>

关于Ruby - 将 "=="十六进制值与字符串进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16815308/

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