문제

파일 (연속 바이트로 저장)에서 서명되지 않은 정수를 읽고 정수로 변환하려고합니다. 나는 이것을 시도했다 :

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

각각은 바이트 바이트를 바이트로 반복합니다.

Ruby의 이진 데이터를 구문 분석하는 데 도움이되는 몇 가지 라이브러리가 있습니다. 간단한 고급 선언 DSL로 데이터 형식을 선언 한 다음 모든 포장, 풀기, 비트 핏불, 이동 및 엔디언 변환을 파악할 수 있습니다. 그들 자신.

나는 이것들 중 하나를 사용한 적이 없지만 여기에 두 가지 예가 있습니다. (더 많은 것이 있지만 나는 그들을 모른다) : :

파일에 저장된 숫자는 어떤 형식입니까? 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를 얻으면 엔디 언 문제입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top