read () в Python, выбрасывающий закодированные значения во время чтения двоичного файла - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь прочитать огромный двоичный файл. Я использовал метод чанков и разбил свой поток на чанки, например:

with open("testUniform.bin", 'rb') as f:
            for chunk in iter(lambda: f.read(4096), b''):
                dostuff(chunk) 

Все, что я получаю в куске, это:

.y.$.!... 

как поток, к которому я прикрепил скриншот.

У меня нет выхода, чтобы преобразовать его обратно в двоичный поток, и я до сих пор не знаю, почему этот поток преобразуется в нечто подобное. Пожалуйста, помогите:

![enter image description here

Я пытаюсь преобразовать двоичный поток в десятичные значения, но, поскольку я являюсь огромным файлом, я не могу применить f.read() Вот мой код прилагается:

from math import log,ceil,pow
from flask import Flask, request
from flask_restful import Resource, Api
import struct

app = Flask(__name__)
api = Api(app)
def binaryToDecimal(n): 
        return int(n,2)     
def dostuff(inputarray):
        args = request.args
        lower_end_range = args['lower_end_range']
        higher_end_range = args['higher_end_range']
        amount = args['amount']
        lower_end_range =int(lower_end_range)
        higher_end_range=int(higher_end_range)
        amount          =int(amount)
        #range_input is the range
        range_input=higher_end_range-lower_end_range+1 
        #taking the log of the range  to generate offset
        log_of_range=log(range_input,2)
        log_of_range=int(ceil(log_of_range)) 
        higher_end_range_represented_by_bits     =   0
        lower_end_range_represented_by_bits      =   0    
        lst                                      =   []
        FinalRandomArray                         =   []
        #creating the maximum of numbers which  it can go to by saving,for ex: 2^3+2^2+2^1+2^0
        for i in range(0,(log_of_range)):
                higher_end_range_represented_by_bits+=pow(2,i)
        while True:
            i=range_input%2
            range_input=range_input/2
            lst.append(i)
            if range_input==0:
                break
        length    =   len(lst)
        #where length is equal to the window size
        for file in range(0,len(inputarray),length):
            print(inputarray[0])
            number=binaryToDecimal((inputarray[file]+inputarray[file+1]+inputarray[file+2]))+lower_end_range
            if(number>=lower_end_range and number<=higher_end_range):
                    if(amount!=0):
                        FinalRandomArray.append(number)
                        amount-=1
        return {'finalrandomarray':FinalRandomArray}         
class ReturnMainModule(Resource):
    def get(self):
        with open("testUniform.bin", 'rb') as f:
            for chunk in iter(lambda: f.read(4096), b''):
                dostuff(chunk)

api.add_resource(ReturnMainModule, '/main')

# Driver code   
if __name__ == '__main__':
    app.run(port='5004')
...