将C#转换为Delphi Real48 [英] Convert C# double to Delphi Real48
问题描述
我发现以下问题将Delphi Real48转换为C#double 但是我想以另一种方式,C#到Delphi。
I've found the following question Convert Delphi Real48 to C# double but I want to go the other way, C# to Delphi.
有谁知道这可以做到吗?我尝试了逆向工程代码,但没有多少运气。
Does anyone know how this can be done? I've tried reverse engineering the code but without much luck.
更新:
代码将需要一个double,并将其转换为Real48(字节[]大小为6)。
I'm after C# code that will take a double and convert it into a Real48 (byte[] of size 6).
谢谢
推荐答案
我发现这个线程寻找相同的代码。这是我最后写的:
I came across this thread looking for the same code. Here is what I ended up writing:
public static byte [] Double2Real48(double d)
{
byte [] r48 = new byte[6];
byte [] da = BitConverter.GetBytes(d);
for (int i = 0; i < r48.Length; i++)
r48[i] = 0;
//Copy the negative flag
r48[5] |= (byte)(da[7] & 0x80);
//Get the expoent
byte b1 = (byte)(da[7] & 0x7f);
ushort n = (ushort)(b1 << 4);
byte b2 = (byte)(da[6] & 0xf0);
b2 >>= 4;
n |= b2;
if (n == 0)
return r48;
byte ex = (byte)(n - 1023);
r48[0] = (byte)(ex + 129);
//Copy the Mantissa
r48[5] |= (byte)((da[6] & 0x0f) << 3);//Get the last four bits
r48[5] |= (byte)((da[5] & 0xe0) >> 5);//Get the first three bits
r48[4] = (byte)((da[5] & 0x1f) << 3);//Get the last 5 bits
r48[4] |= (byte)((da[4] & 0xe0) >> 5);//Get the first three bits
r48[3] = (byte)((da[4] & 0x1f) << 3);//Get the last 5 bits
r48[3] |= (byte)((da[3] & 0xe0) >> 5);//Get the first three bits
r48[2] = (byte)((da[3] & 0x1f) << 3);//Get the last 5 bits
r48[2] |= (byte)((da[2] & 0xe0) >> 5);//Get the first three bits
r48[1] = (byte)((da[2] & 0x1f) << 3);//Get the last 5 bits
r48[1] |= (byte)((da[1] & 0xe0) >> 5);//Get the first three bits
return r48;
}
Real48与IEEE 754类似,因为尾数会一样。这个位移是必要的,以使尾数在正确的位置。
Real48 is similar to IEEE 754 in that the Mantissa will be the same. The bit shift are necessary to get the Mantissa in the right location.
Real48指数的偏差为129,双倍的偏差为1023。
Real48 exponent has a bias of 129 and the double has a bias of 1023.
负标志存储在最后一个字节的第一位。
The negative flag is stored in the first bit of the last byte.
注意:
我不认为这个代码可以在一个大端机上工作。它不检查NAN或INF。
Notes: I don't think this code will work on a big endian machine. It does not check for NAN or INF.
这是将real48转换为双精度的代码。它是从Free Pascal编译器移植的:
Here is the code that converts a real48 to a double. It was ported from the Free Pascal compiler:
static double real2double(byte [] r)
{
byte [] res = new byte[8];
int exponent;
//Return zero if the exponent is zero
if (r[0] == 0)
return (double)0;
//Copy Mantissa
res[0] = 0;
res[1] = (byte)(r[1] << 5);
res[2] = (byte)((r[1] >> 3) | (r[2] << 5));
res[3] = (byte)((r[2] >> 3) | (r[3] << 5));
res[4] = (byte)((r[3] >> 3) | (r[4] << 5));
res[5] = (byte)((r[4] >> 3) | ((r[5] & 0x7f) << 5));
res[6] = (byte)((r[5] & 0x7f) >> 3);
//Copy exponent
//correct exponent
exponent = (r[0] + (1023-129));
res[6] = (byte)(res[6] | ((exponent & 0xf) << 4));
res[7] = (byte)(exponent >> 4);
//Set Sign
res[7] = (byte)(res[7] | (r[5] & 0x80));
return BitConverter.ToDouble(res, 0);
}
这篇关于将C#转换为Delphi Real48的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!