R 如何将原始向量中的字节转换为 ascii space

R How to convert a byte in a raw vector into a ascii space

我正在阅读一些由 C 代码创建的非常古老的文件,这些文件由 header (ASCII) 和数据组成。我使用 readBin() 来获取 header 数据。当我尝试将 header 转换为字符串时失败,因为有 3 个 'bad' 字节。其中两个是二进制 0,另一个是二进制 17 (IIRC)。

如何将坏字节转换为 ASCII SPACE? 我尝试了以下代码的某些版本,但失败了。

      hd[hd == as.raw(0) | hd  == as.raw(0x17)] <- as.raw(32)

我想用 space 替换每个错误值,这样我就不必在解析从 hd 派生的字符串时重新计算所有固定数据位置。

我通常只是转换为整数。

假设我们有这个原始向量:

raw_with_null <- as.raw(c(0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 
                          0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21))

如果我们尝试将其转换为字符,则会出现错误,因为空字节:

rawToChar(raw_with_null)
#> Error in rawToChar(raw_with_null): embedded nul in string: 'Hello[=11=]World!'

很容易转换为数字并将任何 0 或 23 替换为 32 (ascii space)

nums <- as.integer(raw_with_null)

nums[nums == 0 | nums == 23] <- 32

然后我们可以将 nums 转换回原始格式,然后再转换为字符:

rawToChar(as.raw(nums))
#> [1] "Hello World!"

reprex package (v2.0.1)

于 2022-03-05 创建