Python 字节的解释。 (C 记忆)
Python interpretation of bytes. (C memcpy)
我是 python 的新人。我尝试在 python 中重写一些 C++ 代码,我从串行端口获取数据(我们使用我们自己的协议)并且需要将字节转换为 C++ 中的值我使用类似这样的东西(小端字节但我们可以得到自定义起始位和 bitLength)
long getLong(size_t startBit, size_t countBit, unsigned char* data)
{
long lResult = 0L;
long L1;
for (i = 0; i < countBit; i++)
{
L1 = long(data[(i+startBit)/8] >> ((i+startBit)%8)) & 1L;
lResult = (lResult & ~(1L << i)) | (L1 << i);
}
return lResult;
}
值不能超过 4 个字节,这就是我使用 long 的原因
有时值可以是浮点数,而不是我只是从这个函数中使用 long 并做 memcpy 来重新解释字节
{
float res;
memcpy(&res,&longValue,sizeof(float));
result=res;
break;
}
in python 我从 C++ lib 中获取了 unsigned char 的列表(在 python 中显然是 int)
我可以通过按位运算以相同的 C++ 方式获得长值
def _bytes_to_val(self, byte_list, start_bit, count_bit):
result=0
for i in range(0,count_bit):
val = (byte_list[(i+start_bit)//8] >> ((i+start_bit)%8)) & 1
result = (result & ~(1 << i)) | (val << i)
return result
但是如何获得浮动?我阅读了有关 byteArray 的内容,但它是字符串表示形式,并且 python 仅对浮点值使用双重标准。我唯一想到的是将此函数附加到 c++ lib,但我想一定是其他方式。
工作量太大。
>>> struct.unpack('i', b'\xdb\x0fI@')
(1078530011,)
>>> struct.unpack('f', b'\xdb\x0fI@')
(3.1415927410125732,)
我是 python 的新人。我尝试在 python 中重写一些 C++ 代码,我从串行端口获取数据(我们使用我们自己的协议)并且需要将字节转换为 C++ 中的值我使用类似这样的东西(小端字节但我们可以得到自定义起始位和 bitLength)
long getLong(size_t startBit, size_t countBit, unsigned char* data)
{
long lResult = 0L;
long L1;
for (i = 0; i < countBit; i++)
{
L1 = long(data[(i+startBit)/8] >> ((i+startBit)%8)) & 1L;
lResult = (lResult & ~(1L << i)) | (L1 << i);
}
return lResult;
}
值不能超过 4 个字节,这就是我使用 long 的原因 有时值可以是浮点数,而不是我只是从这个函数中使用 long 并做 memcpy 来重新解释字节
{
float res;
memcpy(&res,&longValue,sizeof(float));
result=res;
break;
}
in python 我从 C++ lib 中获取了 unsigned char 的列表(在 python 中显然是 int) 我可以通过按位运算以相同的 C++ 方式获得长值
def _bytes_to_val(self, byte_list, start_bit, count_bit):
result=0
for i in range(0,count_bit):
val = (byte_list[(i+start_bit)//8] >> ((i+start_bit)%8)) & 1
result = (result & ~(1 << i)) | (val << i)
return result
但是如何获得浮动?我阅读了有关 byteArray 的内容,但它是字符串表示形式,并且 python 仅对浮点值使用双重标准。我唯一想到的是将此函数附加到 c++ lib,但我想一定是其他方式。
工作量太大。
>>> struct.unpack('i', b'\xdb\x0fI@')
(1078530011,)
>>> struct.unpack('f', b'\xdb\x0fI@')
(3.1415927410125732,)