在R中将十六进制格式转换为浮点数

5

请问有人能帮我翻译一下如何在R中将4字节十六进制格式转换为浮点数吗?例如,我想将“aec7a042”转换为“80.39”。我在R中搜索了很多内容,但没有找到任何可以进行此转换的方法!C函数是BitConverter.ToSingle。但我需要在R中完成相同的操作。请有人能帮忙吗?


你能进一步解释一下你的十六进制数字是如何等于 80.39 的吗? - Pierre L
实际上,你提到的函数不是C函数,我认为你可以找到一个解决方法来读取二进制数据,这可能会有所帮助:http://www.ats.ucla.edu/stat/r/faq/read_binary.htm - DarioDF
@PierreLafortune - 确实看起来很匹配 - 例如 - https://gregstoll.dyndns.org/~gregstoll/floattohex/ - 返回相同的结果,尽管是反向的。 - thelatemail
@thelatemail 我得到了 0x42a0c7ae。它接近于 OP 的结果,但仍需要进一步澄清。 - Pierre L
@MrFlick非常感谢您的帮助。readBin没有起作用,但其他两个代码可以正常工作,我非常感激。 - Parisa Kouchaki
1个回答

6

在 R 中,以前你可以直接使用 readBin 读取这个值。看起来你有一个 4 字节的带符号浮点值。你可以用以下方式读取:

readBin("aec7a042", "double", size=4)
# [1] 80.39

然而,更新版本的R需要更多的工作。这些替代方案应该可以解决问题。

x <- "aec7a042"
readBin(as.raw(strtoi(substring(x, (step<-seq(1, nchar(x), by=2)), step+1), 16)), "double",n=1,size=4)
# or 
readBin(as.raw(strtoi(apply(matrix(strsplit(x,"")[[1]],2),2,paste, collapse=""), 16)), "double", size=4)
# or 
readBin(as.raw(strtoi(strsplit(x,"(?<=..)",p=TRUE)[[1]],16)), "double", size=4)

我们的想法是需要将字符串分成两个字符一组,然后将这些组转换为整数值,并像字节一样处理这些值。这部分看起来像:

xraw <- strsplit(x,"(?<=..)",p=TRUE)[[1]] |> # [1] "ae" "c7" "a0" "42"
  strtoi(16) |>                              # [1] 174 199 160  66
  as.raw()                                   # [1] ae c7 a0 42

在这里,我们更明确地将字符字符串转换为字节的原始向量。因此,您可以看到xraw包含相同的数据,但它不再是字符形式,而是实际的“原始”二进制向量。这就是readBin所期望的。

readBin(xraw, "double", size=4)
# [1] 80.39

readBin最近有更新吗?在R 3.2.4上无法正常工作,会出现有关输入需要是二进制的错误。 - thelatemail
1
一个更冗长的版本是 x<-"aec7a042"; readBin(as.raw(strtoi(substring(x, (step<-seq(1, nchar(x), by=2)), step+1), 16)), "double",n=1,size=4),使用来自 https://dev59.com/uF4b5IYBdhLWcg3wXAZ1 的代码。 - MrFlick
1
如果你想要更高级一些,可以使用以下代码:readBin(as.raw(strtoi(strsplit(x,"(?<=..)",p=TRUE)[[1]],16)), "double", size=4) - thelatemail
@thelatemail 不错啊,我应该想到使用正则表达式。 - MrFlick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接