Ruby- 파일에서 바이트 읽기, 정수로 변환
문제
파일 (연속 바이트로 저장)에서 서명되지 않은 정수를 읽고 정수로 변환하려고합니다. 나는 이것을 시도했다 :
file = File.new(filename,"r")
num = file.read(2).unpack("S") #read an unsigned short
puts num #value will be less than expected
여기서 내가 뭘 잘못하고 있니?
해결책 4
좋아, 나는 그것을 일하게했다 :
num = file.read(8).unpack("N")
모든 도움에 감사드립니다.
다른 팁
당신은 충분한 바이트를 읽지 않습니다. Tadman의 답변에 대한 의견에서 말했듯이 202
대신에 3405691582
처음 2 바이트가 주목하십시오 0xCAFEBABE
~이다 0xCA
= 202
단일 숫자로 8 바이트를 모두 원한다면 서명되지 않은 단락보다 더 많이 읽어야합니다.
노력하다
num = file.read(8).unpack("L_")
밑줄은 기본 Long이 8 바이트가 될 것이라고 가정합니다. 이는 확실히 보장되지 않습니다.
곡예물을 보는 것은 어떻습니까? (루비 1.9, p. 44)
File.open("testfile")
do |file|
file.each_byte {|ch| print "#{ch.chr}:#{ch} " }
end
각각은 바이트 바이트를 바이트로 반복합니다.
파일에 저장된 숫자는 어떤 형식입니까? 16 진수입니까? 당신의 코드는 나에게 정확해 보인다.
이진 데이터를 처리 할 때는 Windows에있는 경우 이진 모드로 파일을 열어야합니다. 이것은 읽기와 쓰기 모두에 적용됩니다.
open(filename, "rb") do |file|
num = file.read(2).unpack("S")
puts num
end
소스 플랫폼에 따라 "Endian"인코딩에 문제가있을 수 있습니다. 예를 들어, 오래된 MAC 시스템, IBM 전원 서버, PS3 클러스터 또는 SUN SPARC 서버를 포함하는 PowerPC 기반 머신.
"적은"방법의 예를 게시 할 수 있습니까? 일반적으로 데이터에는 명백한 패턴이 있습니다.
예를 들어, 0x1234를 원하지만 0x3412를 얻으면 엔디 언 문제입니다.
제휴하지 않습니다 StackOverflow