def read(fileobj, version=None):
    """Read tz data from a binary file.

    @param fileobj:
    @param version:
    @return: TZFileData
    """
    magic = fileobj.read(5)
    if magic[:4] != b"TZif":
        raise ValueError("not a zoneinfo file")
    if version is None:
        version = int(magic[4:]) if magic[4] else 0
    fileobj.seek(20)
    # Read the counts:
    # [0] - The number of UT/local indicators stored in the file.
    # [1] - The number of standard/wall indicators stored in the file.
    # [2] - The number of leap seconds for which data entries are stored
    #       in the file.
    # [3] - The number of transition times for which data entries are
    #       stored in the file.
    # [4] - The number of local time types for which data entries are
    #       stored in the file (must not be zero).
    # [5] - The number of characters of time zone abbreviation strings
    #  stored in the file.

    (ttisgmtcnt, ttisstdcnt, leapcnt,
     timecnt, typecnt, charcnt) = _read_counts(fileobj)
    if version >= 2:
        # Skip to the counts in the second header.
        data_size = (5 * timecnt +
                     6 * typecnt +
                     charcnt +
                     8 * leapcnt +
                     ttisstdcnt +
                     ttisgmtcnt)
        fileobj.seek(data_size + 20, os.SEEK_CUR)
        # Re-read the counts.
        (ttisgmtcnt, ttisstdcnt, leapcnt,
         timecnt, typecnt, charcnt) = _read_counts(fileobj)
        ttfmt = 'q'
    else:
        ttfmt = 'i'

    times = array(ttfmt)
    times.fromfile(fileobj, timecnt)
    if sys.byteorder != 'big':
        times.byteswap()

    type_indices = array('B')
    type_indices.fromfile(fileobj, timecnt)

    # Read local time types.
    type_infos = []
    for i in range(typecnt):
        type_infos.append(struct.unpack(">iBB", fileobj.read(6)))

    abbrs = fileobj.read(charcnt)

    if version > 0:
        # Skip to POSIX TZ string
        fileobj.seek(12 * leapcnt + ttisstdcnt + ttisgmtcnt, os.SEEK_CUR)
        posix_string = fileobj.read().strip().decode('ascii')
    else:
        posix_string = None

    # Convert type_infos
    for i, (gmtoff, isdst, abbrind) in enumerate(type_infos):
        abbr = abbrs[abbrind:abbrs.find(0, abbrind)].decode()
        type_infos[i] = (gmtoff, isdst, abbr)

    return TZFileData(version, type_infos, times, type_indices, posix_string)
Read tz data from a binary file.

    @param fileobj:
    @param version:
    @return: TZFileData