雑草に多すぎることなく大丈夫です。私はバイナリファイルを取って、一度に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
ææææåææäèééçæèèèæçèêæèééèéëêêçëêêêéêëéëêëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëéëëéèèåæåäåäæéàãäáãäáãàââããäááâãâäâäääãääääæäçëéêéèéééææèèåçèäåååèãæääåèæçæçèåçæçæåææãâáàäææäâßäääæäáããâááâãÞàáæâÞáÞßàÚÛÜÜÝßÞÝßÛßàÙÝßßÛÜÛÛÝÜÚÛÚ×ÕÚÙÖÚÖÓÖÔÓÔÕÒÕÒÔÔÓÓÒÒÏÏÐÍÌÍÑËÉÉÆÊÍÇçëéçéçéäãèçèççêèææèçæåæåèèèæææçæèçèêéççêéèèæéêëéêêëëëëéëëéëêééëëëëëëëëëëëëëëëëëéëèêèææèêéééäåååãäååääåæäãããäãâååããæçåçççèèèçææèèæççéçèæåææèèæææãåæçåæåçæèæçèåçèéçäãåãääßääåäåãäãåããäãåâáÞáßßÞâßßÜÞ
「バイト」と「バイト様オブジェクト」について学ぶことをお勧めします。 –