programing

루비에서 이진 파일을 문자열로 읽기

firstcheck 2023. 6. 2. 22:21
반응형

루비에서 이진 파일을 문자열로 읽기

tar 파일을 가져와 문자열로 변환하는 쉬운 방법이 필요합니다(또는 그 반대의 경우도 마찬가지입니다.루비에서 이것을 할 수 있는 방법이 있습니까?내 최선의 시도는 다음과 같습니다.

file = File.open("path-to-file.tar.gz")
contents = ""
file.each {|line|
  contents << line
}

그 정도면 문자열로 변환할 수 있을 거라고 생각했는데, 이렇게 다시 쓰려고 하면...

newFile = File.open("test.tar.gz", "w")
newFile.write(contents)

같은 파일이 아닙니다.하고있다ls -l에서는 파일 크기가 서로 다르지만 상당히 가깝습니다(파일을 열면 대부분의 내용이 그대로 표시됨).제가 하고 있는 작은 실수나 이를 달성하기 위한 완전히 다른(그러나 실행 가능한) 방법이 있습니까?

먼저 파일을 이진 파일로 열어야 합니다.그러면 한 명령으로 전체 파일을 읽을 수 있습니다.

file = File.open("path-to-file.tar.gz", "rb")
contents = file.read

그러면 전체 파일이 문자열로 표시됩니다.

그 후에, 당신은 아마도file.close그렇게 하지 않으면,file가비지 제거될 때까지 닫히지 않으므로 열려 있는 동안 시스템 리소스가 약간 낭비됩니다.

이진 모드가 필요한 경우 다음과 같은 어려운 방법으로 수행해야 합니다.

s = File.open(filename, 'rb') { |f| f.read }

그렇지 않은 경우, 더 짧고 달콤한 것은 다음과 같습니다.

s = IO.read(filename)

파일을 열어두지 않으려면 File.open에 블록을 전달하는 것이 가장 좋습니다.이렇게 하면 블록이 실행된 후 파일이 닫힙니다.

contents = File.open('path-to-file.tar.gz', 'rb') { |f| f.read }

루비에 이진 판독값이 있습니다.

data = IO.binread(path/filaname)

또는 Ruby 1.9.2보다 작은 경우

data = IO.read(path/file)

개폐식 안전장치는 어떻습니까?

string = File.open('file.txt', 'rb') { |file| file.read }

os x에서 이것들은 나에게 동일합니다...창에 추가 "\r"이 있을 수 있습니까?

어떤 경우에도 다음을 더 잘 수행할 수 있습니다.

contents = File.read("e.tgz")
newFile = File.open("ee.tgz", "w")
newFile.write(contents)

Base64에서 tar 파일을 인코딩할 수 있습니다.기본 64는 일반 텍스트 파일에 저장할 수 있는 파일의 순수 ASCII 표현을 제공합니다.그런 다음 텍스트를 다시 디코딩하여 tar 파일을 검색할 수 있습니다.

다음과 같은 작업을 수행합니다.

require 'base64'

file_contents = Base64.encode64(tar_file_data)

더 나은 아이디어를 얻기 위해 Base64 Rubydocs를 살펴보세요.

Ruby 1.9+는 (@bardzo의 답변 참조) 그리고 또한 옵션으로 인코딩 전달을 지원합니다.IO.read:

  • 루비 1.9

    data = File.read(name, {:encoding => 'BINARY'})
    
  • 루비 2+

    data = File.read(name, encoding: 'BINARY')
    

(두 경우 모두)'BINARY'별칭입니다.'ASCII-8BIT'.)

tar 파일을 Base64로 인코딩하고 일반 텍스트 파일에 저장할 수 있는 경우

File.open("my_tar.txt").each {|line| puts line}

또는

File.new("name_file.txt", "r").each {|line| puts line}

cmd의 각 (텍스트) 줄을 인쇄합니다.

언급URL : https://stackoverflow.com/questions/130948/read-binary-file-as-string-in-ruby

반응형