当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R readBin 与连接之间传输二进制数据


R语言 readBin 位于 base 包(package)。

说明

从连接或原始向量读取二进制数据或将二进制数据写入连接或原始向量。

用法

readBin(con, what, n = 1L, size = NA_integer_, signed = TRUE,
        endian = .Platform$endian)

writeBin(object, con, size = NA_integer_,
         endian = .Platform$endian, useBytes = FALSE)

参数

con

connection 对象或命名文件或原始向量的字符串。

what

其模式将给出要读取的向量的模式的对象,或者说明模式的长度为 1 的字符向量: "numeric" , "double" , "integer" , "int" , "logical" , "complex" , "character" , "raw" 之一。

n

数字。要读取的(最大)记录数。您可以在此处使用over-estimate,但不能太大,因为存储空间是为n 项目保留的。

size

整数。字节流中每个元素的字节数。默认值 NA_integer_ 使用自然大小。原始向量和复杂向量不支持大小更改。

signed

合乎逻辑的。仅当确定文件中的数量应被视为有符号整数或无符号整数时,才用于大小为 1 和 2 的整数。

endian

文件的目标系统的endian-ness("big""little")。使用"swap"将强制交换endian-ness。

object

一个R要写入连接的对象。

useBytes

请参阅writeLines

细节

这些函数只能与binary-mode 连接一起使用。如果con 是字符串,则函数调用file 来获取在函数调用期间打开的binary-mode 文件连接。

如果连接打开,则从当前位置读取/写入。如果未打开,则在调用期间以适当的模式(二进制读或写)打开它,然后再次关闭。打开的连接必须处于二进制模式。

如果使用 con 原始向量调用 readBin,则向量中的数据将用作输入。如果使用 con 原始向量调用 writeBin,则仅指示应返回原始向量。

如果指定了size,而不是对象的自然大小,则向量的每个元素在写入或读取之前都会被强制为适当的类型。对于整数或逻辑向量,可能的大小为 1、2、4 和可能为 8;对于数值向量,可能的大小为 4、8 和可能为 12/16。 (请注意,强制转换作为有符号类型发生,除非在读取大小为 1 和 2 的整数时 signed = FALSE。)更改大小不太可能保留 NA ,并且扩展精度大小不太可能跨平台移植。

readBinwriteBin 读写C 风格的zero-terminated 字符串。输入字符串限制为 10000 个字符。 readCharwriteChar可用于读写固定长度字符串。不检查该字符串在当前区域设置的编码中是否有效。

处理R缺失且特殊(Inf,-InfNaN)值在“R 数据导入/导出”手册中讨论。

一次调用中只能写入 字节(这是 32 位平台上原始向量的最大容量)。

‘Endian-ness’ 与 size > 1 相关,并且应始终为可移植代码设置(默认值仅适用于在同一平台上写入和读取文件时)。

对于 readBin ,具有适当模式和长度的向量读取的项目数(可能小于 n )。

对于 writeBin ,原始向量(如果 con 是原始向量)或不可见的 NULL

注意

如果 C 类型 long 的大小为 8 字节或 C 类型 long long 存在且大小为 8 字节,则大小为 8 的整数读/写将可用。

仅当该类型可用且与 double 不同时,才可以进行 sizeof(long double) 大小(通常为 12 或 16 字节)的实际读/写。

如果 readBin(what = character()) 在不包含 C 风格字符串的文件上错误使用,则会给出警告(通常是很多)。从文件或连接中,输入将被分成长度为 10000 的片段,并丢弃任何最终部分。

例子

zzfil <- tempfile("testbin")
zz <- file(zzfil, "wb")
writeBin(1:10, zz)
writeBin(pi, zz, endian = "swap")
writeBin(pi, zz, size = 4)
writeBin(pi^2, zz, size = 4, endian = "swap")
writeBin(pi+3i, zz)
writeBin("A test of a connection", zz)
z <- paste("A very long string", 1:100, collapse = " + ")
writeBin(z, zz)
if(.Machine$sizeof.long == 8 || .Machine$sizeof.longlong == 8)
    writeBin(as.integer(5^(1:10)), zz, size = 8)
if((s <- .Machine$sizeof.longdouble) > 8)
    writeBin((pi/3)^(1:10), zz, size = s)
close(zz)

zz <- file(zzfil, "rb")
readBin(zz, integer(), 4)
readBin(zz, integer(), 6)
readBin(zz, numeric(), 1, endian = "swap")
readBin(zz, numeric(), size = 4)
readBin(zz, numeric(), size = 4, endian = "swap")
readBin(zz, complex(), 1)
readBin(zz, character(), 1)
z2 <- readBin(zz, character(), 1)
if(.Machine$sizeof.long == 8 || .Machine$sizeof.longlong == 8)
    readBin(zz, integer(), 10,  size = 8)
if((s <- .Machine$sizeof.longdouble) > 8)
    readBin(zz, numeric(), 10, size = s)
close(zz)
unlink(zzfil)
stopifnot(z2 == z)

## signed vs unsigned ints
zzfil <- tempfile("testbin")
zz <- file(zzfil, "wb")
x <- as.integer(seq(0, 255, 32))
writeBin(x, zz, size = 1)
writeBin(x, zz, size = 1)
x <- as.integer(seq(0, 60000, 10000))
writeBin(x, zz, size = 2)
writeBin(x, zz, size = 2)
close(zz)
zz <- file(zzfil, "rb")
readBin(zz, integer(), 8, size = 1)
readBin(zz, integer(), 8, size = 1, signed = FALSE)
readBin(zz, integer(), 7, size = 2)
readBin(zz, integer(), 7, size = 2, signed = FALSE)
close(zz)
unlink(zzfil)

## use of raw
z <- writeBin(pi^{1:5}, raw(), size = 4)
readBin(z, numeric(), 5, size = 4)
z <- writeBin(c("a", "test", "of", "character"), raw())
readBin(z, character(), 4)

也可以看看

“R 数据导入/导出”手册。

readChar 读取/写入固定长度字符串。

connectionsreadLineswriteLines

.Machine 的大小为 longlong longlong double

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Transfer Binary Data To and From Connections。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。