Converting byte string into signed, unsigned (int_8, int_16, int_32, ...) integer in Ruby

  

  ########################################

  # acceptable format

  # '\x00', '\x00\x00', '\x00\x00\x00', '\x00\x00\x00\x00', '\x00\x00\x00\x00\x00', '\x00\x00\x00\x00\x00\x00', '\x00\x00\x00\x00\x00\x00\x00' ...

  # '0x0', '0x00', '0x000', '0x0000', '0x00000', '0x000000', '0x0000000', '0x000000000', '0x0000000000', '0x00000000000' ...

  # '0', '00', '000', '000', '00000', '000000', '0000000', '000000000', '0000000000', '00000000000' ...

  #########################################


  ########################################

  # convert byte string to signed integer

  ########################################

  def byte_string_to_unigned_integer(string)

    byte_string = string.downcase.gsub("\\x","").dup

    byte_string.slice! "0x"

    byte_string.hex

  end


  ########################################

  # convert byte string to signed integer

  ########################################

  def byte_string_to_signed_integer(string)

    byte_string = string.downcase.gsub("\\x","").dup

    byte_string.slice! "0x"

    bit_count = byte_string.length * 4

    signed_integer_value = byte_string.hex


    expected_bit_count = 8;

    #make sure it's 8, 16, 32, 64, 128 ... bits

    loop {

      bit_count = expected_bit_count if bit_count <= expected_bit_count

      break if expected_bit_count == bit_count

      expected_bit_count *= 2

    }


    # add missing Zeros '0' infront of string

    chars = signed_integer_value.to_s(2).rjust(bit_count, '0').scan /\w/


    # find MIN value

    minimum_value_bit_array = Array.new(bit_count, '1')

    minimum_value_bit_array[0] = '0'

    minimum_value = (minimum_value_bit_array.join('').to_i(2) * -1) - 1


    # if first bit is '1' it's negative value

    if chars[0] == '1'

      # find positive value

      chars[0] = '0'

      signed_string = chars.join('')

      # and add it to mininum value

      signed_integer_value = minimum_value + signed_string.to_i(2)

    end

    signed_integer_value

  end



Test Code


RESULTS = { '0x00' => 0, '00' => 0, '0' => 0,

            '0xFF' => -1, '0xff' => -1, 'FF' => -1, 'ff' => -1,

            '0xF' => 15, '0xf' => 15, '0F' => 15, '0f' => 15,

            '0x3F' => 63, '\x3f' => 63, '3F' => 63, '3f' => 63,

            '0xD8' => -40, '\xd8' => -40, 'D8' => -40, 'd8' => -40,

            '0xE7' => -25, '0xe7' => -25, 'E7' => -25, 'e7' => -25,

            '0x01' => 1, '0x1' => 1, '01' => 1, '\x1' => 1,

            '0x0A' => 10, '\x0a' => 10, '\x00\x0a' => 10, '\x00\x00\x0a' => 10,'\xA' => 10, 'a' => 10 }


RESULTS.each do |value, answer|

    result = byte_string_to_signed_integer(value)

    

    if result != answer

      puts "fail - expected : #{answer}, result : #{result}, given : #{value}"

    else

      puts "success - expected : #{answer}, result : #{result}, given : #{value}"

    end

end

신고

박상건 - gunnih




나는 요즘 봉두 때문에 일이 하나 더 늘어났다. 

그 일이라는 것이 봉두의 연설을 들어주는 일이다. 

봉두의 목청에 대해서는 이미 말한 바 있지만 그 우렁찬 목소리와 분노에 찬 어조는 너무나 강하기 때문에 말의 내용보다 언어 외적인 곳으로 주위를 끌기에 오히려 모자람이 없을 지경이다. 봉두 이야기를 쓰면서부터 봉두 자신이 '내 친구, 김봉두'의 독자가 되었기 때문이다. 아마 봉두는 쥐뿔이가 자신을 가장 잘 이해해 주는 친구로 생각을 하게 된 것 같았다. 그래서 자신이 부당하다고 생각되는 일이 있으면 쥐뿔을 불러서 앉혀놓고 마치 쥐뿔이가 타도의 대상이나 되는 것처럼 열변을 토하는 것이다. 쥐뿔은 원래 나약하고 부드러운 정서를 지닌 사람인데 어쩌다 그의 카타르시스의 통로가 되어버렸는지 황당할 때가 있기도 하다. 그러나 어찌하랴, 이 모든 것이 자업자득이요, 자승자박이요, 자가당착이요, 자충수인 것을. 


그날의 일은 서각의 불찰이었다. 


'내 친구, 김봉두'에는 돼지 껍데기 먹는 이야기가 나온다. 내 가까운 벗 가운데 그 돼지 껍데기에 대하여 흠모의 념을 가진 분이 두 사람 있다. 두분 모두 우아한 용모와 그윽한 기품을 지닌 여성들이다. 굳이 이름을 말한다면, 한분은 '우아한 여인'이고 또 한분은 '귀여운 여인'이다. 그날 두 분을 위해서 돼지 껍데기를 공양하는 거사를 행하기로 하고 예의 돼지 껍데기집에서 만났다. 

  

초저녁이라 손님이라고는 우리밖에 없었다. 화덕 앞에 둘러앉아 조용히 이야기를 나누며, 돼지 껍데기의 질감과 맛에 대해 깊이 탐닉하고 있는데 '봉두' 이야기가 나왔다. 나는 무심히 봉두에게 무전기를 눌렀다. 그것이 불찰이었다. 그가 찬바람을 가르며 득달같이 달려왔다. 


그 다음은 봉두의 연설회로 무대가 바뀌었다. 

서각이 봐, 난 속상해 죽겠네. 

뭐가 그리 속상한가? 


최틀러가 말이야, 감히 성당에서 자기 변명을 하잖아, 그래서 내가 방송국에 전화를 했지. 성당이 개인의 유세장인가? 감히 성당이 어디라고 말이야. 거기서 자기 변명을 늘어놓고 말이야. 하느님이 어디 그따위 변명을 들어주는 분이냐 말이야. 담당 피디가 성당이 아니고 딴나라당 당사에서 했다 하드구만 

말이야. 아무래도 그렇지 그걸 티브이에 내 보내고 말이야. 


돼지 껍데기는 구울 때 잘 구워야 한다. 너무 익으면 이놈이 

석쇠 위 오십센티 가량 튀어오른다. 잘 보았다가 적당히 


익었을 때 얼른 열이 약한 곳으로 옮겨야 한다. 봉두의 이야기가 진행되는 동안 우리는 굽는 일에서 잠시 소홀하게 되었다. 봉두의 이야기가 한참 최고조에 달했을 때, 느닷없이 돼지 껍데기가 타닥! 튀기 시작했다. 


봉두는 거기에 개의치 않았다. 

요즘 언론이나 여론들 말이야 정말 마음에 들지 않아. 

정치 자금 수사에 형평성이 있어야 한다고 말이야. 지들이 


언제 형평성 소리를 한 적이 있어! 


과거 독재 시대에 아무 말 못하고 있더니, 형평성이라니,

그게 말이나 되는 소리야. 형평이고 나발이고 지금 수사 

잘하고 있잖아. 잘못했으면 반성이나 할 일이지. 

입이 열 개라도 말못할 넘들이 형평성 좋아하네. 

돼지 껍데기가 또 한번 튀었다. 


언론들 말이야. 

지들은 사실 보도를 한다고 하는데 진정한 사실 보도는 

그런 게 아니야. 사실 보도를 하려면 역대 대통령 당선자 

가운데 누가 정치 자금을 가장 적게 쓰고 대통령이 되었는가? 그걸 보도하란 말이야. 우리가 어떻게 해서 대통령을 뽑았는가 말이야. 조선민국 건국 이후 부정 부패의 주류를 끊은 것이 


지난 대선 아니야? 그렇게 해서 우리는 민주화를 한 발 앞으로 나가게 한 것 아닌가? 근데 뭐야? 측근이 몇 천 만원 받았다고, 집 한 채 어떻게 했다고, 부동산 투기라고 하고 물고 늘어지고 말이야, 그걸 사실보도라고 할 수 있어? 또 돼지 껍데기가 튀었다. 이번엔 이넘이 튀어서 내 이마로 날아왔다. 그 때는 봉두도 예의 그 약간 틈이 생긴 대문 이를 드러내고 사람 좋게 웃었다. 


어떤 넘들은 말이야, 적게 받았든 많이 받았든 그넘이 그넘이고, 정치하는 넘들 믿을 넘 한 넘도 없다고 한데 말이야, 


이 말도 자세히 뜯어보면 딴나라당이 수세에 몰리니까 하는 말 아니겠어? 말이 났으니 말이지. 그 때 놈현이 되리라고 믿은 넘 누가 있어? 다들 창이 된다고 했잖아, 정치 자금이 어디로 갔겠어? 모두 창에게 줄 서기 했잖아? 우리 역사상 돈 많이 쓰고 떨어진 건 그넘들 뿐이잖아. 그게 선거 혁명이 아니겠어? 그런데 왜들 그렇게 난리야. 딴나라당 지들이 대통령에게 할 말이 있다는 게 신기해. 벌써 은퇴해야할 것들이, 

역사의 죄인들이 무슨 말이 그렇게 많아? 차떼기로 돈 받아 

먹은 넘들이 말이야? 

이번엔 돼지 껍데기가 튀지 않았다. 불이 사위었기 때문이다. 


데모를 너무 많이 해. 돼 먹지 않은 것들이 너도 나도 데모야. 그리고 말이야, 대통령을 대통령으로 인정을 안 해. 얼마나 어렵게 뽑은 대통령이야. 

왜들 그래? 응? 지난 시대 같으면 대통령이 죽으라면 죽는 

시늉을 하던 것들이 말이야. 지금은 민주화 되었다고, 

입 달린 것들은 모두 한 마디씩 하잖아? 민주화? 지들이 민주화를 위해 뭘 했어? 죽어가며, 고문당하며, 민주 열사들이 온몸으로 이루어낸 민주화야! 길 닦아 놓으니 문디 먼저 지나간다고 말이야. 택도 아닌 것들이 저마다 한 마디씩 하고 있어. 밤이 깊었다. 이제 마실 소주도, 튈 것도 없었다. 


불법 자금을 말이야, 트럭으로 받았으면 말이야. 

반성을 해야지, 그리고 법의 심판을 기다려야지. 

언넘이 불렀는 것처럼 말이야. 스스로 검찰에 쳐들어가서 

말이야. 나를 구속해라, 이게 뭐 하는 짓이야. 

법을 그렇게 잘 아는 넘이 검찰이 부르지도 않았는데 

제 발로 가서 날 조사하슈. 이게 법을 공부한 넘의 짓이야? 

이게 데모 아니고 뭐야. 근데 말이야, 더 웃기는 건 

그걸 멋있다고 하는 넘들이 있어요. 사람 환장하게시리 말이야. 


우리는 다소곳한 학생처럼 봉두의 기나긴 연설을 모두 

들어주었다. 그의 연설을 듣느라 고막이 먹먹할 정도였다. 

그날 우리는 자정이 가까워서야 귀가할 수 있었다. 

내 친구, 김봉두, 그의 연설을 경청해준 귀한 두 분, 

우아한 여인과 귀여운 여인께 축복이 있기를. 

그리고 돼지 껍데기가 미용에 다소나마 기여하게 되었기를 

소망하면서 어두운 밤길을 걸어서 집에 왔다. 

신고

박상건 - gunnih




봉두의 고향 마을은 태백산 발치의 강원남도 산골이다. 

태백산맥 줄기에 입지해서인지 이 인근에는 파르티잔(빨치산)이 유난히 많은 곳이었다. 

봉두와 가까워지면서 나는 봉두로부터 그의 고향 마을에 전설처럼 내려오는 한 파르티잔의 이야기를 들을 수 있었다. 

 

나의 머리 속에 영인된 파르티잔의 이미지는 냉정하고 무자비한 인간상이었다. 그것은 아마 나의 성장 시기가 반공 이데올로기가 지배하던 시절로 국한되기 때문일 것이다. 그러나 봉두가 나에게 들려준 파르티잔 이사열의 이야기는 내 머리 속에 심어진 파르티잔의 이미지를 바꾸기에 충분했다. 


봉두의 친구 삼식의 부친이기도 한 이사열은 이 마을에서 

인물 좋고 머리 좋기로 이름난 젊은이였다. 

그가 골목을 지날 때는 동네 처녀들이 울타리 뒤에서 혹은 

울타리 너머에서 몰래 바라보고 가슴을 설레곤 했다고 한다. 독학으로 신학문과 사회 과학 공부를 한 이사열은 해방 공간에서 열렬한 사회주의자로 활동하게 된다.


한국전쟁이 일어나고 인민군이 내려오자 이사열은 군당위원장이 되었다. 

인민군 점령 당시의 사회상은 어느 지역이나 그 양상이 다르지 않았다. 


읍내에 주둔한 인민군은 소와 양식을 징발하고 차용증을 써 주었다. 지주 계급에 억눌려 살던 젊은이들은 빨간 완장을 차고 기세 등등하게 거리를 활보했다. 

 

곧 이어 군인, 경찰, 공무원의 집에는 재산 몰수를 의미하는 빨간딱지가 붙고, 악질 반동분자로 지목된 사람들에 대한 인민 재판이 열리려고 하였다. 북에서 내려온 당 지도위원은 이 일을 일사천리로 진행하고 있었다. 


피의 제전을 벌이려는 당 지도위원에게 이사열은 제동을 걸었다. 


"내 구역은 내가 책임진다. 한 사람도 다치지 않게 하라!" 


물론 지도부로부터 거센 저항이 있었지만 이사열의 의지를 꺾을 수는 없었다. 

그리하여 이 마을에는 인민 제판도 없었고 한 사람의 인명 피해도 일어나지 않았다.   


한국전쟁도 인천 상륙작전으로 역전되었다. 

다시 국군이 마을에 주둔하고 인민군은 태백산맥을 따라 북으로 후퇴하게 되었다. 이사열은 아내와 4남매를 남겨둔 채 인민군과 함께 북으로 갔다. 이 당시 대부분의 마을에서는 마을을 점령하게된 우익 세력들에 의해 보복이 자행되었다. 


어떤 이는 감나무에 묶여 처형당하고 어떤 이는 뭇매를 맞아 폐인이 되기도 했다. 

마을에 남은 이사열의 가족도 피를 말리는 나날을 보내게 되었다. 

그러나 그것은 기우에 지나지 않았다. 가장이 없는 그의 집에는 늘 누가 가져다 놓았는지 쌀, 땔감, 된장 등의 생필품이 마루에 쌓이곤 했다. 봉두 친구, 삼식이 가족은 어려운 전쟁 시기에도 굶주리지 않고 살아남을 수 있었다. 


이사열 씨가 북에서 어떻게 되었는지는 

아무도 아는 사람이 없다. 

진달래꽃이 몇 번 피고 져도 그는 돌아오지 않았다. 

다만 마을 사람들에게, 이념보다 사람이 먼저라는 감동만을 남겨 놓은 채, 

태백산맥을 따라 사라지고 말았다 한다. 

휴머니스트이자 파르티잔인 이사열, 그는 아마 북녘 하늘 어딘가에서 민족의 비상을 위해 왼쪽 날개를 부지런히 움직였을 것이다.

신고

박상건 - gunnih