优化代码以读取文件中的某些 VLV



我正在尝试从我创建的文件中读取一些可变长度的值

该文件包含以下内容:

81 7F 81 01 2F F3 FF

那里有两个VLV,81 7F81 01,它们以十进制255129

我还创建了一些文件阅读器函数,如下所示:

void read_byte_from_file_to(std::fstream& file, uint8_t& to) {
    file.read((char*)&to, 1);
}
unsigned long readVLV(std::fstream& t_midi_file) {
    unsigned long result = 0;
    static unsigned long sum = 0, depth = 0, count = 0;
    uint8_t c;
    read_byte_from_file_to(t_midi_file, c);
    ++count;
    if (c & 0x80) {
        readVLV(t_midi_file);
    }

    sum += (c & 0x7F) << (7 * depth++);
    if (count == depth) {
        result = sum;
        sum = 0;
        depth = 0;
        count = 0;
    }
    return result;
};

虽然在从文件读取时运行readVLV n次会给出前n VLV 的正确答案,但我绝对讨厌我写它的方式,它有这么多的静态参数和那个丑陋的参数重置。所以如果有人能带领我朝着正确的方向前进,我会很高兴。

一个采用函数位置状态的基本_readVLV可以通过编写来完成

unsigned long _readVLV(
        std::fstream& t_midi_file,
        unsigned long sum,
        unsigned long depth) {
    uint8_t c;
    read_byte_from_file_to(t_midi_file, c);
    if (c & 0x80) {
        sum += _readVLV(t_midi_file, sum, depth);
        ++depth;
    }
    return (c & 0x7F) << (7 * depth);
}

并创建一个全局readVLV函数,该函数像这样获取位置信息和文件

unsigned long readVLV(std::fstream& t_midi_file) {
    unsigned long sum = 0, depth = 0, count = 0;
    return _readVLV(t_midi_file, sum, depth, count);
}

相关内容

  • 没有找到相关文章

最新更新