Python 浮动到Real48

Python 浮动到Real48,python,pascal,Python,Pascal,我试图在python中将浮点数转换为Real48(borlandpascal)。我发现这是我写的(我想) static byte[]DoubleToReal48(双d) { 字节[]r=新字节[6]; 长位=位转换器。双字节64位(d); 布尔负=((位>>63)和1)!=0; 长指数=((位>>52)和0x7FF)-1023; 长尾数=位&0xFFFFFFFFFFFL; 长原始=(负?1:0); 原始=(原始>13); 原始=(原始>=8; } 返回r; } 我不懂C#,所以我很难把它翻译成

我试图在python中将浮点数转换为Real48(borlandpascal)。我发现这是我写的(我想)

static byte[]DoubleToReal48(双d)
{
字节[]r=新字节[6];
长位=位转换器。双字节64位(d);
布尔负=((位>>63)和1)!=0;
长指数=((位>>52)和0x7FF)-1023;
长尾数=位&0xFFFFFFFFFFFL;
长原始=(负?1:0);
原始=(原始>13);
原始=(原始>=8;
}
返回r;
}
我不懂C#,所以我很难把它翻译成python。有人能帮我吗?或者有更好的方法吗


我已经找到了,但它似乎只将Real48转换为double,而不是我需要的另一种方式。

让我试着将C#转换为python

1.-将位从双倍数转换为数字(无符号长)

转化为

struct.unpack("Q", struct.pack("d", python_double) )[0]
它使用标准库中的模块

2.-从双重表示中提取每个字段

bool negative = ((bits >> 63) & 1) != 0;
long exponent = ((bits >> 52) & 0x7FF) - 1023;
long mantissa = bits & 0xFFFFFFFFFFFFFL;
这可以逐字翻译,因为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个字符,因为struct默认使用处理器的endianness(在我的例子中是x86),但这可以通过第一个参数控制


提示:如果要将数字转换为二进制表示形式,可以使用
'{:064b}'。格式(数字)
。这将用零填充它以填充64个字符。

在目标类型不存在的情况下,您希望如何将类型转换转换为具有动态类型的语言?所以您是说这无法完成?不一定,只是Python中没有
Real48
,所以无论您做什么都取决于
Real48
的外观类似于Python中的你。你会定义自己的类来存储它们吗?你有这样的库吗?也就是说,试图在Python中包含Real48是没有意义的。你是在尝试序列化数据以便在遗留的Pascal程序中进行后续加载吗?是的-我们有一个加载日志文件的旧数据处理软件(来自数据记录器)。格式为“字符串”14字节中,第一个1-8字节是TDataTime中的日期,第9-14字节是real48中的值。我们的新日志系统会写入日志的csv文件。我正在尝试查看我是否将新的csv日志转换为旧格式,以便我们仍然可以使用我们的数据处理软件。非常感谢您-我在
尾数=bits&0xfffffffffl。我正在使用Python3.4。必须删除数值文本中的尾随
L
,我假设是Python2。谢谢..你救了我的周末:-)
negative = ((bits >> 63) & 1)    # Integer 1 for negative, 0 for positive
exponent = ((bits >> 52) & 0x7FF) - 1023
mantissa = bits & 0xFFFFFFFFFFFFF
long raw = (negative ? 1 : 0);
raw = (raw << 39) | (mantissa >> 13);
raw = (raw << 8) | ((exponent + 129) & 0xFF);
raw = negative
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;
}    
data = struck.pack('Q', raw)
data = data[:6]  # Drop the 16 MSB