首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从一个数字创建Delphi扩展的10个字节?

如何从一个数字创建Delphi扩展的10个字节?
EN

Stack Overflow用户
提问于 2021-01-27 13:19:32
回答 2查看 154关注 0票数 1

我知道这可能是一个非常罕见的问题。

我有一个用Delphi写的服务,一个用C#写的客户端。Delphi服务尝试从C#客户端读取10字节的Extended数据类型。

经过研究,我在C#中找到了一些将10字节的Extended转换为数字(Convert Delphi Extended to C#)的示例代码。但是我找不到任何示例来将数字转换为10字节的Extended,这样我就可以将其发送回服务。

我试着自己写代码,但计算对我来说很难理解。

有谁可以帮我?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-27 14:33:33

Delphi (32位目标)本机支持扩展数据类型。您可以只复制扩展变量中的10个字节。例如:

代码语言:javascript
运行
复制
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;

扩展数据类型的二进制格式可以在here中找到。对这种格式更好的描述是here

票数 1
EN

Stack Overflow用户

发布于 2021-01-29 11:54:12

很抱歉没有把问题说清楚,但谢谢你在这里发表的所有评论。

我让代码正常工作,它看起来不是那么完美,但是单元测试已经通过了。

感谢@fpiette发来的链接,它让我大吃一惊。

代码语言:javascript
运行
复制
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;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65913285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档