파일에서 부호없는 정수를 읽으려고합니다 (연속 바이트로 저장 됨) 정수로 변환하려고합니다. 나는 이것을 시도했다 :루비 - 파일에서 바이트를 읽고 정수로 변환
file = File.new(filename,"r")
num = file.read(2).unpack("S") #read an unsigned short
puts num #value will be less than expected
내가 뭘 잘못하고 있니?
파일에서 부호없는 정수를 읽으려고합니다 (연속 바이트로 저장 됨) 정수로 변환하려고합니다. 나는 이것을 시도했다 :루비 - 파일에서 바이트를 읽고 정수로 변환
file = File.new(filename,"r")
num = file.read(2).unpack("S") #read an unsigned short
puts num #value will be less than expected
내가 뭘 잘못하고 있니?
좋아, 내가이 일을하는 데 : 모두를위한
num = file.read(8).unpack("N")
감사합니다 당신의 도움.
파일에 저장된 숫자의 형식은 무엇입니까? 16 진수입니까? 귀하의 코드가 나에게 맞는 것 같습니다.
이진 데이터를 처리 할 때는 Windows에서 이진 모드로 파일을 여는 지 확인해야합니다. 이것은 읽기와 쓰기 모두에 해당됩니다.
open(filename, "rb") do |file|
num = file.read(2).unpack("S")
puts num
end
원본 플랫폼에 따라 "엔디안"인코딩 문제가있을 수 있습니다. 예를 들어 PowerPC 기반 시스템에는 이전 Mac 시스템, IBM Power 서버, PS3 클러스터 또는 Sun Sparc 서버가 포함됩니다.
'덜'이라는 예를 게시 할 수 있습니까? 일반적으로 데이터에는 명백한 패턴이 있습니다.
예를 들어 0x1234를 원하지만 0x3412를 얻는 경우 엔디안 문제입니다.
Java .class 파일의 매직 넘버를 읽으려고합니다. 내 코드는 마술 번호로 202를 생성하지만 3405691582 (0xCAFEBABE) 여야합니다. 그것은 "rb"를 사용할 때 변경되지 않았습니다. – Peter
또한 Linux를 사용하고 있는데 바이너리 모드로 파일을 여는 것에 대해 걱정할 필요가 있습니까? – Peter
유닉스에서 바이너리 모드를 명시 적으로 사용하는 것은 여전히 좋은 방법입니다. 상처를 입히지 않고 (단지 아무 작업도하지 않지만) 코드를 더 명확하게하고 b.) 누군가가 Windows에서 코드를 실행하면 많은 디버깅을 절약 할 수 있습니다. –
충분한 바이트를 읽지 않습니다. 당신이 tadman의 대답에 주석에서 말하는 것처럼, 당신은, 당신이 정말로 하나의 숫자에있는 모든 8 바이트를 원하는 경우 0xCAFEBABE
의 처음 2 바이트 0xCA
= 202
것을 대신 3405691582
공지 사항의 202
를 얻을 수 ,
은 밑줄은 원래 길이가 8 바이트가 될 것입니다 가정한다
num = file.read(8).unpack("L_")
시도 서명되지 않은 짧은
이상 읽을 필요 확실히 보장 할 수는 없습니다.Pickaxe를 살펴 보는 것은 어떻습니까? (Ruby 1.9, p. 44)
File.open("testfile")
do |file|
file.each_byte {|ch| print "#{ch.chr}:#{ch} " }
end
each_byte는 바이트 단위로 파일을 반복합니다.
VM 사양에 따르면 "멀티 바이트 데이터 항목은 항상 상위 바이트가 먼저 오는 빅 엔디안 순서로 저장됩니다." – Peter