Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,以十进制数字的形式读取文件块_Python_File_Decimal_Bit Manipulation - Fatal编程技术网

在Python中,以十进制数字的形式读取文件块

在Python中,以十进制数字的形式读取文件块,python,file,decimal,bit-manipulation,Python,File,Decimal,Bit Manipulation,我的输入文件可能是任意的,因此我将使用 f = open("in-file", 'rb') 块大小约为4K字节,因此我将使用 f.read(4096) 我想做的是从文件中逐块读取。 此外,由于块实际上是一个$2^15$位的4KB序列,因此在读取块时,我需要将其转换为十进制值,以便进一步计算 例如,如果第一个块的形式是0000…10,我想要的是另一个变量保持相应的十进制值,例如,x=2 据我所知,它的代码可以帮助我逐块阅读 def tobits(s): result = []

我的输入文件可能是任意的,因此我将使用

f = open("in-file", 'rb')
块大小约为4K字节,因此我将使用

f.read(4096)
我想做的是从文件中逐块读取。 此外,由于块实际上是一个$2^15$位的4KB序列,因此在读取块时,我需要将其转换为十进制值,以便进一步计算

例如,如果第一个块的形式是0000…10,我想要的是另一个变量保持相应的十进制值,例如,x=2

据我所知,它的代码可以帮助我逐块阅读

def tobits(s):
    result = []
    for c in s:
        bits = bin(ord(c))[2:]
        bits = '00000000'[len(bits):] + bits
        result.extend([int(b) for b in bits])
    return result

但是,我不知道如何将输出列表转换为十进制值。有人能给我一些示例代码吗?谢谢。

如果我正确理解了这个问题,您需要以下内容:

def bytes_to_long(bytes):
    result = 0l
    for c in bytes:
        result *= 256
        result += ord(c)
    return result

也就是说,这可能会有点慢,4kB是一个相当大的长度,并且会产生很多垃圾。您可能会通过每次迭代使用和处理多个字节来改进这一点,但接下来您必须处理右端和所有问题。在Python3上,您可能也不需要ord,因为它应该从IO方法返回字节类型。

如果我正确理解这个问题,您需要以下内容:

def bytes_to_long(bytes):
    result = 0l
    for c in bytes:
        result *= 256
        result += ord(c)
    return result
也就是说,这可能会有点慢,4kB是一个相当大的长度,并且会产生很多垃圾。您可能会通过每次迭代使用和处理多个字节来改进这一点,但接下来您必须处理右端和所有问题。在Python3上,您可能也不需要ord,因为它应该从IO方法返回字节类型。

通过引用,我发现以下代码可能会运行得更快,因为它似乎不涉及算术

def ByteToHex( byteStr ):
    return ''.join( [ "%02X " % ord( x ) for x in byteStr ] ).strip()
因此,例如,通过以下代码可以完成将2字节块读取为十进制数的任务:

in_file=open("in-file", "rb")
piece = in_file.read(2)
a=ByteToHex(piece)
a=int(a,16)
通过引用,我发现下面的代码可能会运行得更快,因为它似乎不涉及算术

def ByteToHex( byteStr ):
    return ''.join( [ "%02X " % ord( x ) for x in byteStr ] ).strip()
因此,例如,通过以下代码可以完成将2字节块读取为十进制数的任务:

in_file=open("in-file", "rb")
piece = in_file.read(2)
a=ByteToHex(piece)
a=int(a,16)

您的问题有点不清楚:数据块是一堆您想要数值的字节吗?或者它是文本,也就是说,一个用1和0字符写在基数2中的数字?要知道,在程序的内存中通常没有十进制数,它都是某种二进制表示。是的,块是一个文件的位序列。例如,如果chunk size设置为2,并且一个文件的格式恰好为10010100,那么该文件有4个chunk,分别为00、01、01、10。int'10010100',2是您要查找的吗?2表示从基2开始,即二进制。@user4478我真正想问的是,当你说文件包含01000001时,你是说在文本编辑器中打开时,我看到的是a,而不是字符串01000001。这似乎是一个愚蠢的问题,但单词二进制表示法不够明确,足以引起混淆。您的问题有点不清楚:该块是您想要的数字值的一堆字节吗?或者它是文本,也就是说,一个用1和0字符写在基数2中的数字?要知道,在程序的内存中通常没有十进制数,它都是某种二进制表示。是的,块是一个文件的位序列。例如,如果chunk size设置为2,并且一个文件的格式恰好为10010100,那么该文件有4个chunk,分别为00、01、01、10。int'10010100',2是您要查找的吗?2表示从基2开始,即二进制。@user4478我真正想问的是,当你说文件包含01000001时,你是说在文本编辑器中打开时,我看到的是a,而不是字符串01000001。这似乎是一个愚蠢的问题,但“二进制表示”一词的含混程度足以引起混淆。