我试图在python中将浮点数转换为Real48(Borland Pascal)。我发现这个method写的是C#(我认为)
static byte[] DoubleToReal48(double d)
{
byte[] r = new byte[6];
long bits = BitConverter.DoubleToInt64Bits(d);
bool negative = ((bits >> 63) & 1) != 0;
long exponent = ((bits >> 52) & 0x7FF) - 1023;
long mantissa = bits & 0xFFFFFFFFFFFFFL;
long raw = (negative ? 1 : 0);
raw = (raw << 39) | (mantissa >> 13);
raw = (raw << 8) | ((exponent + 129) & 0xFF);
for (int k = 0; k < 6; k++)
{
r[k] = (byte)(raw & 0xFF);
raw >>= 8;
}
return r;
}
我不知道C#,所以我很难将它翻译成python。谁能帮我?或许还有更好的方法?
我找到this但它似乎只将Real48转换为双倍,而不是我需要的其他方式。
答案 0 :(得分:3)
让我尝试将C#翻译成python
1.-将位从双数转换为数字(无符号长long)。
long bits = BitConverter.DoubleToInt64Bits(d);
转换为
struct.unpack("Q", struct.pack("d", python_double) )[0]
它使用标准库中的struct模块。
2.-从双重表示中提取每个字段
bool negative = ((bits >> 63) & 1) != 0;
long exponent = ((bits >> 52) & 0x7FF) - 1023;
long mantissa = bits & 0xFFFFFFFFFFFFFL;
这可以逐字翻译alsmot,因为python中存在相同的运算符。
negative = ((bits >> 63) & 1) # Integer 1 for negative, 0 for positive
exponent = ((bits >> 52) & 0x7FF) - 1023
mantissa = bits & 0xFFFFFFFFFFFFF
3.-再将数字装入48位
long raw = (negative ? 1 : 0);
raw = (raw << 39) | (mantissa >> 13);
raw = (raw << 8) | ((exponent + 129) & 0xFF);
与数字2相同,
raw = negative
raw = (raw << 39) | (mantissa >> 13)
raw = (raw << 8) | ((exponent + 129) & 0xFF)
4.-将数字转换为6字节的字符串
for (int k = 0; k < 6; k++)
{
r[k] = (byte)(raw & 0xFF);
raw >>= 8;
}
在第1步中使用struck,
data = struck.pack('Q', raw)
data = data[:6] # Drop the 16 MSB
注意:我删除了最后2个字符,因为struct使用处理器&#39;默认情况下是字节顺序(在我的例子中是x86),但可以用第一个参数控制。
提示:如果要将数字转换为二进制表示,可以使用'{:064b}'.format(number)
。这将用零填充它以填充64个字符。