그래서 일부 MongoDB 프로토콜 작업을하고 있습니다. 모든 정수는 리틀 엔디안에 서명되어 있습니다.Ruby에 서명 된 리틀 엔디안 압축 풀기
positive_one = Array(1).pack('V') #=> '\x01\x00\x00\x00'
negative_one = Array(-1).pack('V') #=> '\xFF\xFF\xFF\xFF'
그러나, 다른 방법을 가고는 String#unpack
방법은 특별히 반환 설명 된 'V'형식이 : 루비의 표준 Array#pack
방법을 사용하여, 나는 이진 문자열 정수 내가 잘 할에서 을 변환 할 수 있습니다 부호 정수 : 서명 little endian의 바이트 순서에 대한 포맷터 없습니다
positive_one.unpack('V').first #=> 1
negative_one.unpack('V').first #=> 4294967295
. 나는 비트 - 시프 팅으로 게임을하거나 배열 패킹을 사용하지 않는 자신의 바이트 - mangling 방법을 쓸 수있을 것이라고 확신하지만, 다른 누군가가 이것을 실행하고 간단한 해결책을 찾았는지 궁금하다. 매우 감사합니다.
그게 _ 거의 _ 작동합니다. 'if self> = 0x8000_0000' -'&'연산자는 부울이 아닌 정수를 반환해야합니다. 그렇지 않으면, 고마워! 그게 가장 간단한 해결책 인 것 같고, 내 방식을 모든 단위 테스트에 합격 한 것입니다. – SFEley
@SFEley : 조건부를 다시 작성하는 것이 바람직한 방식으로 편집 했으므로 특별히 서명 비트를 테스트하는 것이 확실합니다. 또한 'else'조건을 포함하지 않은 버그를 수정했기를 바랍니다. –