【问题标题】:Weird DataInputStream skip behavior in GLib(Vala)GLib(Vala)中奇怪的 DataInputStream 跳过行为
【发布时间】:2020-09-19 14:49:16
【问题描述】:

我正在为我的 .NBS(Note Block Studio 歌曲文件)编辑器创建一个辅助类,在编写将 .NBS 文件加载到结构中的部分时,我遇到了一个非常奇怪的 DataInputStream 跳过行为。例如,如果作者姓名是“Wattana”,它将显示为“attana”,我必须将跳过减少到 3 个字节。为什么在song_author 之前跳过4 个字节会跳过字符串中的第一个字符,而在song_name 之前跳过则不会?

(帮助类的部分代码)

public static SongData to_song_data (DataInputStream data_stream) {
        // Specifications for the NBS file format can be found at https://opennbs.org/nbs
        data_stream.set_byte_order (DataStreamByteOrder.LITTLE_ENDIAN);
        var song_data = new SongData();

        // Note to self: a "short" is 2 bytes(16 bits) long.
        // TODO: Add error handler.
        song_data.old_version = data_stream.read_int16 ();
        song_data.version = data_stream.read_byte ();
        song_data.vanilla_intrument_count = data_stream.read_byte ();
        song_data.length = data_stream.read_int16 ();
        song_data.layer_count = data_stream.read_int16 ();
        data_stream.skip (4); // 4 bytes(32 bits) must be skipped before reading any string from an NBS file.
        song_data.song_name = data_stream.read_line ();
        data_stream.skip (3); // Not sure why 4 bytes skip doesn't work here.
        song_data.song_author = data_stream.read_line ();

        return song_data;
    }

【问题讨论】:

  • 您是否使用十六进制转储验证该文件实际上包含应该跳过的 4 个字节?

标签: glib vala


【解决方案1】:

您可以添加一些错误处理以获取更多详细信息:

try {
    data_stream.skip (4);
} catch (IOError error) {
    print (@"error.message\n");
}

另请注意,.skip() 返回跳过的字节数或错误时返回 -1。因此,您可以在调试中对此进行测试。

还有一个问题是你为什么要跳过? NBS format specification 声明“字符串由一个 32 位整数组成,然后是字符的那么多字节”。据我所知,您正在跳过长度整数,而您应该将其用作循环的计数器以读取文件中的以下字符,然后在末尾添加一个零字节以使其成为 Vala 字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2012-07-28
    相关资源
    最近更新 更多