我知道这可能是一个非常罕见的问题。
我有一个用Delphi写的服务,一个用C#写的客户端。Delphi服务尝试从C#客户端读取10字节的Extended
数据类型。
经过研究,我在C#中找到了一些将10字节的Extended
转换为数字(Convert Delphi Extended to C#)的示例代码。但是我找不到任何示例来将数字转换为10字节的Extended
,这样我就可以将其发送回服务。
我试着自己写代码,但计算对我来说很难理解。
有谁可以帮我?
发布于 2021-01-27 14:33:33
Delphi (32位目标)本机支持扩展数据类型。您可以只复制扩展变量中的10个字节。例如:
const
// Binary representation of Extended number "123456789012345678"
Bin : array [0..9] of Byte = (0, 167, 121, 24, 211,
165, 77, 219, 55, 64);
procedure TForm1.Button1Click(Sender: TObject);
var
V : Extended;
I : Integer;
begin
V := PExtended(@Bin[0])^; // Copy Bin to V
Memo1.Lines.Add(Format('%22f', [V]));
end;
发布于 2021-01-29 11:54:12
很抱歉没有把问题说清楚,但谢谢你在这里发表的所有评论。
我让代码正常工作,它看起来不是那么完美,但是单元测试已经通过了。
感谢@fpiette发来的链接,它让我大吃一惊。
public static byte[] WriteExtendedToBuffer(double value)
{
var extendedBuffer = Enumerable.Repeat((byte)0x0, 10).ToArray();
if (!double.IsNaN(value) && !double.IsInfinity(value) && (value != 0))
{
var doubleBuff = BitConverter.GetBytes(value);
var sign = doubleBuff[7] & 0x80;
doubleBuff[7] = (byte)(doubleBuff[7] & 0x7F);
var exp = BitConverter.ToUInt16(doubleBuff, 6);
doubleBuff[7] = 0;
doubleBuff[6] = (byte)(doubleBuff[6] & 0x0F);
var massive = BitConverter.ToUInt64(doubleBuff);
exp >>= 4;
if (exp == 0)
{
exp = 16383 - 1022;
Buffer.BlockCopy(BitConverter.GetBytes(exp), 0, extendedBuffer, 8, 2);
extendedBuffer[9] = (byte)(extendedBuffer[9] | sign);
massive <<= 11;
Buffer.BlockCopy(BitConverter.GetBytes(massive), 0, extendedBuffer, 0, 8);
}
else
{
exp = (ushort)(16383 + exp - 1023);
Buffer.BlockCopy(BitConverter.GetBytes(exp), 0, extendedBuffer, 8, 2);
extendedBuffer[9] = (byte)(extendedBuffer[9] | sign);
massive <<= 11;
Buffer.BlockCopy(BitConverter.GetBytes(massive), 0, extendedBuffer, 0, 8);
extendedBuffer[7] = (byte)(extendedBuffer[7] | 0x80);
}
}
return extendedBuffer;
}
https://stackoverflow.com/questions/65913285
复制相似问题