【问题标题】:MKV file cluster size which is encoded?MKV文件簇大小是哪个编码的?
【发布时间】:2018-02-15 09:47:28
【问题描述】:

元素 ID(也称为 EBML ID),从 ID 本身开始,然后是数据大小。

数据大小(以八位字节为单位)也使用类似 UTF-8 的系统进行编码。

如何解码十进制的数据大小

【问题讨论】:

    标签: c++ hex ascii webm mkv


    【解决方案1】:

    您可以在以下位置找到以下简单示例代码 https://github.com/wangf1978/DumpTS/blob/master/Matroska.h

    static uint64_t UnpackUnsignedIntVal(CBitstream&bs, uint8_t max_octs = 8, bool unPackVal=true, uint8_t* pcbValLen=nullptr)
    {
        uint8_t nLeadingZeros = 0;
        uint64_t u64Val = bs.GetByte();
        for (uint8_t i = 0; i < max_octs; i++)
            if ((u64Val&(1ULL << (7 - i))) == 0)
                nLeadingZeros++;
            else
                break;
    
        if (nLeadingZeros >= max_octs)  // Unexpected
            return UINT64_MAX;
    
        if (unPackVal)
            u64Val &= ~(1 << (7 - nLeadingZeros));
    
        for (uint8_t i = 0; i<nLeadingZeros; i++)
            u64Val = (((uint64_t)u64Val) << 8) | (uint8_t)bs.GetBits(8);
    
        if (pcbValLen != nullptr)
            *pcbValLen = nLeadingZeros + 1;
    
        return u64Val;
    }
    
    virtual int Unpack(CBitstream& bs)
    {
        // Read the element ID
        uint64_t u64Val = UnpackUnsignedIntVal(bs, 4, false);
        if (u64Val == UINT64_MAX)
            return -1;
    
        ID = (uint32_t)u64Val;
    
        if ((u64Val = UnpackUnsignedIntVal(bs)) == UINT64_MAX)
            return -1;
    
        Size = u64Val;
    
        //printf("ID: 0X%X, Size: %lld(0X%llX)\n", ID, Size, Size);
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2020-03-08
      • 2018-10-28
      • 2020-07-09
      • 2018-06-01
      • 1970-01-01
      相关资源
      最近更新 更多