2017-05-13 4 views
2

雑草に多すぎることなく大丈夫です。私はバイナリファイルを取って、一度に1バイトずつ読み込み、それを4ビットに変換し、それを次のバイトとマージして、新しいバイトを再作成するために4ビットに変換します。バイナリファイルを修正するPython

私はこれを、最小値と最大値をとり、自分の「スロット」に16で割るルックアップテーブルと比較してバイト値を読み取ることでこれを行います。次に、値を1つずつ見て、それらのスロットに基づいて新しい値(4ビットの0〜15バイナリ)を保存し、その番号をシフトして、次のバイトでXORを読み込みます。

私のプログラムは動作していて、1と0を書いているようですが、バイナリではなく文字列として格納していると思います。何か案は?

import sys 
import binascii 

def converttwobytes(value1, value2): 
    newvalue = 0 
    newvalue = newvalue^value1 
    newvalue1 = newvalue << 4 
    newvalue = newvalue1^value2 
    return newvalue 


if (len(sys.argv) != 3): 
    print ('\n\n\nPlease enter 3 parameters: the file name to run, a file to read, a file to write to and try again, example: python prgm1.py read.txt write.txt\n\n\n') 
else: 
    readfile = sys.argv[1] 
    writefile = sys.argv[2] 
    with open(readfile, "rb") as binary_file: 
    # Read the whole file at once 
    data = binary_file.read() 
    length = len(data) 

    framelength = 16 


    # Seek position set to 0 and read header of 21 bytes 
    binary_file.seek(0) # Go to beginning 
    header = binary_file.read(21) 
    counter = 21 
    with open(writefile, 'wb') as writeline: 
     writeline.write(header + '\n') 

     for filesize in range(counter,length,16): 
      #latest seek value 
      binary_file.seek(filesize) 
      maxnum = 0 
      minnum = 0 
      for frame in range(0,framelength): 
       value = ord(binary_file.read(1)) 
       if frame == 0: 
        minnum = value 
        maxnum = minnum 
       elif value > maxnum: 
        maxnum = value 
       elif value < minnum: 
        minnum = value 


      totalspread = maxnum - minnum 
      binary_file.seek(filesize) 
      # 16 is max number of 4 bits binary 
      bucketsize = (totalspread/16) 

      #reset seek back to frame start location 
      binary_file.seek(filesize) 
      newlist = [] 
      for frame in range(0,framelength): 
       value = ord(binary_file.read(1)) 
       result =0 
       if value < (minnum+bucketsize): 
        result = 0 
       elif value < (minnum+(bucketsize*2)): 
        result =1 
       elif value < (minnum+(bucketsize*3)): 
        result =2 
       elif value < (minnum+(bucketsize*4)): 
        result =3 
       elif value < (minnum+(bucketsize*5)): 
        result =4 
       elif value < (minnum+(bucketsize*6)): 
        result =5 
       elif value < (minnum+(bucketsize*7)): 
        result =6 
       elif value < (minnum+(bucketsize*8)): 
        result =7 
       elif value < (minnum+(bucketsize*9)): 
        result =8 
       elif value < (minnum+(bucketsize*10)): 
        result =9 
       elif value < (minnum+(bucketsize*11)): 
        result =10 
       elif value < (minnum+(bucketsize*12)): 
        result =11 
       elif value < (minnum+(bucketsize*13)): 
        result =12 
       elif value < (minnum+(bucketsize*14)): 
        result =13 
       elif value < (minnum+(bucketsize*15)): 
        result =14 
       elif value < (minnum+(bucketsize*16)): 
        result =15 

       newlist.append(result) 
      newlist.reverse() 
      i = 0 
      while i < len(newlist): 
       firstfour = newlist.pop() 
       lastfour = newlist.pop() 

       newbyte = converttwobytes(firstfour, lastfour) 

       writeline.write(bin(newbyte)[2:].zfill(8)) 
       i = i + 2 

これは私がエンコードしようとしているファイルとデコードのサンプルです:

P5 

256 256 

255 




ææææåææäèééçæèèèæçèêæèééèéëêêçëêêêéêëéëêëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëéëëéèèåæåäåäæéàãäáãäáãàââããäááâãâäâäääãääääæäçëéêéèéééææèèåçèäåååèãæääåèæçæçèåçæçæåææãâáàäææäâßäääæäáããâááâãÞàáæâÞáÞßàÚÛÜÜÝßÞÝßÛßàÙÝßßÛÜÛÛÝÜÚÛÚ×ÕÚÙÖÚÖÓÖÔÓÔÕÒÕÒÔÔÓÓÒÒÏÏÐÍÌÍÑËÉÉÆÊÍÇçëéçéçéäãèçèççêèææèçæåæåèèèæææçæèçèêéççêéèèæéêëéêêëëëëéëëéëêééëëëëëëëëëëëëëëëëëéëèêèææèêéééäåååãäååääåæäãããäãâååããæçåçççèèèçææèèæççéçèæåææèèæææãåæçåæåçæèæçèåçèéçäãåãääßääåäåãäãåããäãåâáÞáßßÞâßßÜÞ 
+0

「バイト」と「バイト様オブジェクト」について学ぶことをお勧めします。 –

答えて

0

あなたがreciveます入力プログラムは、文字列になりますので、あなたはそれを変換する必要があります。

bin(int(binascii.hexlify(str(result)), 16)) 
+0

これは、ファイルの各バイトをこのように0b1100000に置きます。元のファイルは66kbだったので、これは私が欲しいものを達成していません。今は264kbです。私はもともとイメージファイルをバイト単位で読み込んだ後、2バイトを取り出して結合していました。それで、成功したならば、私はバイトの量の半分近くを取るべきです。 – shayster01

関連する問題