7

不确定我在这里使用了正确的术语,但是当从常规字符集中转义字节时,我需要printordeparse方法使用 C 表示法(例如"\x05",而不是)。"\005"

x <- "This is a \x05 symbol"
print(x)
[1] "This is a \005 symbol"

有没有一种本地方法可以做到这一点?

我需要这个来生成 BSON:http ://bsonspec.org/#/specification 。所有示例都明确使用\x05符号。

4

2 回答 2

2

侵入内部print似乎是个坏主意。相反,我认为您应该自己进行字符串转义,并最终用于cat打印字符串而无需任何额外的转义。

您可以使用encodeString来进行初始转义、gregexpr识别八进制\0..转义、strtoi将表示八进制数字的字符串转换为这些数字、sprintf以十六进制打印数字以及regenmatches对匹配的部分进行操作。整个过程看起来像这样:

inputString <- "This is a \005 symbol. \x13 is \\x13."
x <- encodeString(inputString)
m <- gregexpr("\\\\[0-3][0-7][0-7]", x)
charcodes <- strtoi(substring(regmatches(x, m)[[1]], 2, 4), 8)
regmatches(x, m) <- list(sprintf("\\x%02x", charcodes))
cat(x, "\n")

请注意,这种方法会将八进制转义转换\005为十六进制转义\x05,但其他转义序列\t\a不会受此影响。您可能还需要更多代码来处理这些问题,但上面应该包含您需要的所有成分。

请注意,您提到的 BSON 规范几乎可以肯定是指原始字节,因此只要您的字符串包含一个代码为 5 的字符,您可以将其写入"\x05"输入中,并且您将该字符串以二进制模式写入所需的输出,它R如何向您打印该字符串并不重要。毕竟,八进制\005和十六进制\x05只是您将要写入的同一字节的两种表示形式。

于 2012-08-06T14:40:58.017 回答
-1

cat符合你的需要吗?请注意,您必须转义反斜杠:

> x <- "This is a \\x05 symbol\n"
> cat(x)
This is a \x05 symbol
于 2012-08-06T01:02:36.187 回答