请问有人能帮我翻译一下如何在R中将4字节十六进制格式转换为浮点数吗?例如,我想将“aec7a042”转换为“80.39”。我在R中搜索了很多内容,但没有找到任何可以进行此转换的方法!C函数是BitConverter.ToSingle。但我需要在R中完成相同的操作。请有人能帮忙吗?
在 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上无法正常工作,会出现有关输入需要是二进制的错误。 - thelatemailx<-"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 的代码。 - MrFlickreadBin(as.raw(strtoi(strsplit(x,"(?<=..)",p=TRUE)[[1]],16)), "double", size=4)
。 - thelatemail
80.39
的吗? - Pierre L0x42a0c7ae
。它接近于 OP 的结果,但仍需要进一步澄清。 - Pierre L