'소개와 설치/Ruby'에 해당되는 글 1건

  1. 2013.08.05 이진 파일을 읽어서 16진수로 보여주는 HexView 소스 with Ruby

 

Ruby 언어 소스:

# Filename: testHexView_02.rb
#
# Execute: ruby testHexView_02.rb [filename]

def toHex(b)
    s = ""
    x1 = (b & 0xF0) >> 4
    x2 = b & 0x0F
    if x1 < 10 then
        s += (x1 + '0'[0].ord).chr
    else
        s += ((x1 - 10) + 'A'.ord).chr
    end
    if (x2 < 10)
        s += (x2 + '0'.ord).chr
    else
        s += ((x2 - 10) + 'A'.ord).chr
    end
    return s
end

def toHex8(n)
    s = ""
    x1 = (n & 0xF0000000) >> 28
    x2 = (n & 0xF000000) >> 24
    x3 = (n & 0xF00000) >> 20
    x4 = (n & 0xF0000) >> 16
    x5 = (n & 0xF000) >> 12
    x6 = (n & 0xF0) >> 8
    x7 = (n & 0xF0) >> 4
    x8 = n & 0x0F
    if x1 < 10 then
        s += (x1 + '0'.ord).chr
    else
        s += ((x1 - 10) + 'A'.ord).chr
    end
    if x2 < 10 then
        s += (x2 + '0'.ord).chr
    else
        s += ((x2 - 10) + 'A'.ord).chr
    end
    if x3 < 10 then
        s += (x3 + '0'.ord).chr
    else
        s += ((x3 - 10) + 'A'.ord).chr
    end
    if x4 < 10 then
        s += (x4 + '0'.ord).chr
    else
        s += ((x4 - 10) + 'A'.ord).chr
    end
    s += " "
    if x5 < 10 then
        s += (x5 + '0'.ord).chr
    else
        s += ((x5 - 10) + 'A'.ord).chr
    end
    if x6 < 10 then
        s += (x6 + '0'.ord).chr
    else
        s += ((x6 - 10) + 'A'.ord).chr
    end
    if x7 < 10 then
        s += (x7 + '0'.ord).chr
    else
        s += ((x7 - 10) + 'A'.ord).chr
    end
    if x8 < 10 then
        s += (x8 + '0'.ord).chr
    else
        s += ((x8 - 10) + 'A'.ord).chr
    end
  
    return s
end


fname = ARGV[0]
begin
    if fname == nil then
        print "Usage: ruby testHexView_02.rb [filename]\n"
        exit(1)
    elsif not File.exist?(fname) then
        print "The file '%s' does not exist.\n" % fname
        exit(1)
    elsif File.directory?(fname) then
        print "%s is a directory\n" % fname
        exit(1)
    end

    fsize = File.size?(fname)
    if fsize != nil then
        print "The size of the file \"%s\" is %d.\n" % [fname, fsize]
        if fsize == 0 then
            exit(1)
        end
    end
    puts
    file2 = File.open(fname, "r")

    n = 0
    dum = ""
    fsize.times {
        if n % 16 == 0 then
            print "%s: " % toHex8(n & 0xFFFFFFFF)
        end
             
        if n % 16 != 8 then
            print " "
        else
            print "-"
        end

        a = file2.read(1)
        print "%s" % toHex(a.ord.to_i & 0xFF)
               
        if a.ord.to_i < ' '.ord.to_i or a.ord.to_i > 0x7F then
            dum += "."
        else
            dum += a
        end
               
        if n > 0 and n % 16 == 15 then
            print "  |%s|\n" % dum
            dum = ""
        end             

        n += 1
    }

    if n > 0 and n % 16 > 0 then
        (16 - (fsize % 16)).times {
            print "   "
        }
        print "  |%s" %dum
        (16 - (fsize % 16)).times {
            print " "
        }
        print "|\n"
        dum = ""
    end

    file2.close
    puts
    print "Read %d bytes\n" % n
rescue => err
    puts "Exception: #{err}"
    err
end

 

예 1

Ruby로 실행하기> ruby testHexView_02.rb temp_1.bin
JRuby로 실행하기> jruby testHexView_02.rb temp_1.bin
The size of the file "temp_1.bin" is 12.

0000 0000:  48 65 6C 6C 6F 20 74 68-65 72 65 0A              |Hello there.    |

Read 12 bytes

 

예 2

Ruby로 실행하기> ruby testHexView_02.rb myFile.ser
JRuby로 실행하기> jruby testHexView_02.rb myFile.ser
C:\test\java7>ruby testHexView_02.rb myFile.ser
The size of the file "myFile.ser" is 130.

0000 0000:  AC ED 00 05 73 72 00 06-50 65 72 73 6F 6E 07 31  |��..sr..Person.1|
0000 0010:  46 DB A5 1D 44 AB 02 00-03 49 00 03 61 67 65 4C  |F��.D�...I..ageL|
0000 0020:  00 09 66 69 72 73 74 4E-61 6D 65 74 00 12 4C 6A  |..firstNamet..Lj|
0000 0030:  61 76 61 2F 6C 61 6E 67-2F 53 74 72 69 6E 67 3B  |ava/lang/String;|
0000 0040:  4C 00 08 6C 61 73 74 4E-61 6D 65 71 00 7E 00 01  |L..lastNameq.~..|
0000 0050:  78 70 00 00 00 13 74 00-05 4A 61 6D 65 73 74 00  |xp....t..Jamest.|
0000 0060:  04 52 79 61 6E 73 71 00-7E 00 00 00 00 00 1E 74  |.Ryansq.~......t|
0000 0070:  00 07 4F 62 69 2D 77 61-6E 74 00 06 4B 65 6E 6F  |..Obi-want..Keno|
0000 0080:  62 69                                            |bi              |

Read 130 bytes

 

 

 

Posted by Scripter
,