Stream 计算字节内容
我正在处理一个包含多个流的复合文件。我对如何计算每个流的内容感到沮丧。我不知道这些字节是文本、mp3还是视频。 例如:有没有办法了解这些字节可能是什么类型的数据Stream 计算字节内容,stream,byte,mp3,Stream,Byte,Mp3,我正在处理一个包含多个流的复合文件。我对如何计算每个流的内容感到沮丧。我不知道这些字节是文本、mp3还是视频。 例如:有没有办法了解这些字节可能是什么类型的数据 b'\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x0bz\xcc\xc9\xc8\xc0\xc0\x00\xc2?\x82\x1e<\x0ec\xbc*8\x19\xc8i\xb3W_\x0b\x14bH\x00\xb2-\x99\x18
b'\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x0bz\xcc\xc9\xc8\xc0\xc0\x00\xc2?\x82\x1e<\x0ec\xbc*8\x19\xc8i\xb3W_\x0b\x14bH\x00\xb2-\x99\x18\x18\xfe\x03\x01\x88\xcf\xc0\x01\xc4\xe1\x0c\xf9\x0cE\x0c\xd9\x0c\xc5\x0c\xa9\x0c%\x0c\x86`\xcd \x0c\x020\x1a\x00\x00\x00\xff\xff\x02\x080\x00\x96L~\x89W\x00\x00\x00\x00\x80(\\B\xefI;\x9e}p\xfe\x1a\xb2\x9b>(\x81\x86/=\xc9xH0:Pwb\xb7\xdck-\xd2F\x04\xd7co'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x0bz\xcc\xc9\xc8\xc0\x00\xc2?\x82\x1e(\x81\x86/=\xc9x00:Pwb\xb7\xdck-\xd2F\xd7co'
是的,每个流内容都有自己的答案。除了不可靠的扩展名之外,这个星球上的每个文件都有一个签名。它可能被删除或错误添加
那么,问题是什么?
在计算中,文件签名是用于识别或验证数据的数据
文件的内容。特别是,它可能指:
- :文件中的字节,用于标识 文件格式;通常为短字节序列(大多数为 2-4字节长)放在文件开头;请参阅
- 或者更一般地说,是对文件内容执行哈希函数的结果:用于验证文件完整性的数据 内容,通常针对传输错误或恶意攻击。 签名可以包含在文件末尾或单独的文件中 文件
- 具有无法解释的含义或多次出现的唯一值,可以(最好)用命名常量替换
- 用于标识协议或协议的常量数值或文本值;有关文件,请参阅
- 不可能被误解为其他含义的独特值(例如)
PNG (89 50 4E 47 0D 0A 1A 0A)
或
那么如何知道每个文件的神奇数字呢?
在这篇文章中,我们发现作者创建了一个奇妙的power shell函数来获取幻数,他还提到了一个工具,我从他的文章中复制了这个
PowerShell V5引入了格式的十六进制,可以提供另一种选择
读取文件并显示十六进制和ASCII值的方法
确定幻数
表单帮助我正在复制此描述
Format Hex cmdlet将文件或其他输入显示为十六进制
要确定字符与输出的偏移量,请添加
行最左边的数字到行顶部的数字
该字符的列
此cmdlet可帮助您确定损坏文件的文件类型
或可能没有文件扩展名的文件。请运行此cmdlet,
然后检查结果以获取文件信息
这个工具对于获取文件的幻数也是非常好的
另一个工具是我不知道如何使用它
现在我们得到了神奇的数字,但是如何知道是什么类型的数据,或者该文件或流是什么?
这是最好的问题。
幸运的是,这些神奇数字有很多数据库。让我列出一些
例如,第一个数据库具有搜索功能。只需输入不带空格的幻数即可进行搜索
你可能会找到。是的,可能。你很可能不会直接找到有问题的文件类型
我面对这个问题,通过针对特定类型的签名测试流来解决它
def GetPngStartingOffset(arr):
#targted magic Number for png (89 50 4E 47 0D 0A 1A 0A)
markerFound = False
startingOffset = 0
previousValue = 0
arraylength = range(0, len(arr) -1)
for i in arraylength:
currentValue = arr[i]
if (currentValue == 137): # 0x89
markerFound = True
startingOffset = i
previousValue = currentValue
continue
if currentValue == 80: # 0x50
if (markerFound and (previousValue == 137)):
previousValue = currentValue
continue
markerFound = False
elif currentValue == 78: # 0x4E
if (markerFound and (previousValue == 80)):
previousValue = currentValue
continue
markerFound = False
elif currentValue == 71: # 0x47
if (markerFound and (previousValue == 78)):
previousValue = currentValue
continue
markerFound = False
elif currentValue == 13: # 0x0D
if (markerFound and (previousValue == 71)):
previousValue = currentValue
continue
markerFound = False
elif currentValue == 10: # 0x0A
if (markerFound and (previousValue == 26)):
return startingOffset
if (markerFound and (previousValue == 13)):
previousValue = currentValue
continue
markerFound = False
elif currentValue == 26: # 0x1A
if (markerFound and (previousValue == 10)):
previousValue = currentValue
continue
markerFound = False
return 0
一旦这个函数找到了幻数
我分割流并保存png文件
arr = stream.read()
a = list(arr)
B = a[GetPngStartingOffset(a):len(a)]
bytesString = bytes(B)
image = Image.open(io.BytesIO(bytesString))
image.show()
最后,这不是一个端到端的解决方案,而是一种了解流内容的方法
感谢您的阅读,感谢@Robert Columbia的耐心如中可能的重复,“我如何判断这些字节是否包含mp3、视频、图像或其他内容?”?没有通用的方法来确定数据格式。有些格式有方便的自识别标题数据,有些则没有。你的问题很不清楚。你到底想做什么?@Kevin这正是我想做的。有没有一种技术或模式用来测试这些字节以接近某个数据??如何读取标题?a我所拥有的是字节,将你的字节与每个已知的文件类型进行比较。就是这样。这不是
magic
;这就是文件
的工作原理。(这两个术语的描述都可以在你最喜欢的man
版本中找到。)“每个文件都有一个签名”不,@Kevin是对的;有些文件,尤其是文本文件(除了一些脚本)不要。@TomBlodget是的,你是对的。文本文件没有签名,除非它具有类似utf-8的编码。这是因为ASCII字符按原样存储。
arr = stream.read()
a = list(arr)
B = a[GetPngStartingOffset(a):len(a)]
bytesString = bytes(B)
image = Image.open(io.BytesIO(bytesString))
image.show()