Stream 计算字节内容

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

我正在处理一个包含多个流的复合文件。我对如何计算每个流的内容感到沮丧。我不知道这些字节是文本、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\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()