gpt4 book ai didi

python - 单精度大端浮点值到 Python 的 float ( double ,大端)

转载 作者:行者123 更新时间:2023-11-28 20:11:18 26 4
gpt4 key购买 nike

我需要通过串行线路 (RS-232) 从 Arduino 接收十六进制编码的单精度大端浮点值。如何将它们转换为 Python 的 double 大端字节序的 float ?

Arduino 发送类似“8192323E”的内容,在 Python 中我想要 0.174387。我找到了“Convert hex to float”,但似乎所有这些都不适用于单精度 float 。

从链接页面来看,这看起来很有希望:

from ctypes import *

def convert(s):
i = int(s, 16) # convert from hex to a Python int
cp = pointer(c_int(i)) # make this into a c integer
fp = cast(cp, POINTER(c_float)) # cast the int pointer to a float pointer
return fp.contents.value # dereference the pointer, get the float

但它仍然不适用于我的单精度 float 。

在 Java ( Processing ) 中我已经能够做到这一点:

float decodeFloat(String inString) {
byte [] inData = new byte[4];

inString = inString.substring(2, 10); // discard the leading "f:"
inData[0] = (byte) unhex(inString.substring(0, 2));
inData[1] = (byte) unhex(inString.substring(2, 4));
inData[2] = (byte) unhex(inString.substring(4, 6));
inData[3] = (byte) unhex(inString.substring(6, 8));

int intbits = (inData[3] << 24) | ((inData[2] & 0xff) << 16) | ((inData[1] & 0xff) << 8) | (inData[0] & 0xff);
//unhex(inString.substring(0, 8));
return Float.intBitsToFloat(intbits);
}

供您引用,这是在 Arduino 上运行的实现十六进制编码的 C 代码。

void serialFloatPrint(float f) {
byte * b = (byte *) &f;
Serial.print("f:");
for(int i=0; i<4; i++) {

byte b1 = (b[i] >> 4) & 0x0f;
byte b2 = (b[i] & 0x0f);

char c1 = (b1 < 10) ? ('0' + b1) : 'A' + b1 - 10;
char c2 = (b2 < 10) ? ('0' + b2) : 'A' + b2 - 10;

Serial.print(c1);
Serial.print(c2);
}
}

最佳答案

基于 Ignacio Vazquez-Abrams's answer ,

import binascii
import struct

text='8192323E'
print(struct.unpack('<f',binascii.unhexlify(text))[0])
# 0.17438699305057526

关于python - 单精度大端浮点值到 Python 的 float ( double ,大端),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4315190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com