numpy数组应该通过flask从python发送到JS。我不想对其进行JSON加密并发送,因为它会增加响应的大小,并最终增加响应时间。所以我想我可以使用tobytes()将numpy转换为字节,通过flask将字节发送给JS,然后将字节转换回JS中的float,发现在Javascript中将打包字节的字符串转换为float 数组很有帮助。
操作列表是
byte_arr = np.array([5.6], dtype=np.float32).tobytes() # Used one value just to make it simple
return byte_arr # Bytes can be directly sent from flask as response
Run Code Online (Sandbox Code Playgroud)
在JS中
str = response.text
bytes = Uint8Array.from(str, c => c.charCodeAt(0))
floats = new Float32Array(bytes.buffer)
Run Code Online (Sandbox Code Playgroud)
但是在JS中转换为float时,我没有得到正确的值。调试时,我发现在JS中,Uint8数组中的某些值与python发送的字节值不匹配。
JS: console.log(bytes) // [51, 51, 255, 64]
Python: for val in byte_arr: print(val, end=" ") // 51, 51, 179, 64
Run Code Online (Sandbox Code Playgroud)
为了验证,我在python中创建了另一个客户端,提出了相同的请求,并将响应字节转换为float。我也在这里遇到了同样的问题。因此,我缩小了范围,问题出在服务器端而不是客户端。使用多个值时,我发现另一件有趣的事情是,只有大于127的数字(我想是)才转换为255。
在尝试一些随机破解时,我尝试在发送响应之前使用python的chr()方法将字节整数转换为字符,并且客户端的转换成功。
byte_arr = np.array([5.6], dtype=np.float32).tobytes()
byte_arr_char = "".join([chr(i) for i in byte_arr])
return …Run Code Online (Sandbox Code Playgroud)