How to write raw type / bytes to stdout?
Asked Answered
G

1

6

I am struggling for quite some time with outputting a raw type to standard output. Here is what I tried and did not work the desired way:

r <- as.raw(c(0x41, 0x00, 0x43)) # r = "A\0C"
cat(rawToChar(r)) # displays warning and skips data after NULL (outputs "A")
cat(r) # outputs "41 00 43"
writeBin(r, stdout()) # error: can only write to binary connection

I am looking for a way to get all three bytes / characters printed to stdout.

Gogetter answered 14/9, 2011 at 20:26 Comment(3)
It's sometimes possible to writeBin(r, "/dev/stdout")Cupule
Can you tell I'm bitter ;) ? I really wish R core would add a connections API. Then rApache could get rid of sendBin as Matt pointed out below.Rahel
The original rationale might have been that the standard connections (i.e., stdin, stdout, and stderr) would always be connected to a text terminal (i.e., keyboard, terminal window). Hence, we have automatic text re-encoding, etc. Now that R has become a more general purpose language, it might be difficult to change that particular aspect without breaking something. A connections API would be helpful.Nosology
N
8

If you are using an operating system that has a 'cat' or similar program, we can pipe arbitrary data to stdout like so:

con <- pipe("cat", "wb")
writeBin(as.raw(c(0x41, 0x00, 0x43)), con)
flush(con)

This has been an issue for some time, especially because we would like to use R for common gateway interface (CGI). I don't believe there is a more direct route, but you might look at the RApache source code, to see how the sendBin function is implemented.

Nosology answered 14/9, 2011 at 21:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.