Я загружаю байтовый массив из строки в кодировке base-64, и я хотел бы проанализировать его.
Однако значения кодируются по-разному, и я хотел бы повторить поведение DataView
.
Пример:
function parse(data){
view = new DataView(data.buffer);
return {
headerSize : view.getUint8(0),
numberOfPlanes : view.getUint16(1, true),
width: view.getUint16(3, true),
height: view.getUint16(5, true),
offset: view.getUint16(7, true)
};
}
Использование:
data = new Uint8Array([8, 96, 0, 0, 2, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
parse(data)
Возвращает {headerSize: 8, numberOfPlanes: 96, width: 512, height: 256, offset: 8}
Позже мне нужно будет использовать DataView.getFloat32
.
Прямо сейчас у меня есть что-то вроде этого:
def get_bin(a):
ba = bin(a)[2:]
return "0" * (8 - len(ba)) + ba
def getUInt16(arr, ind):
a = arr[ind]
b = arr[ind + 1]
return int(get_bin(b) + get_bin(a), 2)
def getFloat32(arr, ind):
return bin_to_float("".join(get(i) for i in arr[ind : ind + 4][::-1]))
def bin_to_float(binary):
return struct.unpack("!f", struct.pack("!I", int(binary, 2)))[0]
Но библиотека может быть более эффективной и универсальной
Пример с плавающей точкой: [111, 62, 163, 36]
должен дать 7.079574826789837e-17