代码之家  ›  专栏  ›  技术社区  ›  Nils

二进制文件中快速反转float32端的方法

  •  1
  • Nils  · 技术社区  · 6 年前

    我有一个二进制文件,大小为数百MB。它包含float32 big-endian格式的示例(每个示例4个字节)。我想把它们转换成little endian格式。一些背景:我想把它们写在一个网站上。wav文件,需要小端格式afaik的数据。

    下面的代码是我当前使用的代码。它似乎工作正常,但速度相当慢(我想是因为我一次只写4个字节):

    import struct
    
    infile = "infile_big_endian.raw"
    outfile = "outfile_little_endian.raw"
    
    with open(infile, "rb") as old, open(outfile , "wb") as new:
        for chunk in iter(lambda: old.read(4), b""):
            chunk = struct.pack("<f", struct.unpack(">f", chunk)[0])
            new.write(chunk)
    

    在python中有没有更快的方法来实现这一点?

    1 回复  |  直到 6 年前
        1
  •  1
  •   user2357112    6 年前

    NumPy可能更快:

    numpy.memmap(infile, dtype=numpy.int32).byteswap().tofile(outfile)
    

    或覆盖输入文件:

    numpy.memmap(infile, dtype=numpy.int32).byteswap(inplace=True).flush()
    

    我们对数组进行内存映射并使用 byteswap 以C速度反转端点。我用过 int32 而不是 float32 以防万一NaNs可能对 浮动32