首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有扩展类型的二进制数据文件的多平台支持

具有扩展类型的二进制数据文件的多平台支持
EN

Stack Overflow用户
提问于 2020-01-30 21:39:28
回答 1查看 46关注 0票数 0

我目前有以下代码来支持从Win32保存在二进制文件中的10字节扩展值,并在其他平台上加载这些扩展值。然而,对于Android (它是ARM而不是INTEL),我需要一些代码来在10字节内存中进行10字节IEEE格式的转换,并在编译器中进行“扩展”类型(实际上是8字节的双精度类型)。

代码语言:javascript
复制
TYPE
  TExtended     = TExtended80Rec;

{$IFDEF INTEL64 }
PROCEDURE ExtendedToIEEE(VAR D : Extended ; VAR E : TExtended); ASSEMBLER;
  ASM
                FLD     QWORD PTR [RCX]
                FSTP    TBYTE PTR [RDX]
                FWAIT
  END;

PROCEDURE IEEEToExtended(CONST E : TExtended ; VAR D : Extended); ASSEMBLER;
  ASM
                FLD     TBYTE PTR [RCX]
                FSTP    QWORD PTR [RDX]
                FWAIT
  END;
{$ELSE }
PROCEDURE ExtendedToIEEE(D : Extended ; VAR E : TExtended);
  BEGIN
    {$IF SizeOf(Extended)=SizeOf(TExtended) }
      MOVE(D,E,SizeOf(Extended))
    {$ELSE }
      !! MISSING !!
    {$ENDIF }
  END;

PROCEDURE IEEEToExtended(CONST E : TExtended ; VAR D : Extended);
  BEGIN
    {$IF SizeOf(Extended)=SizeOf(TExtended) }
      MOVE(E,D,SizeOf(Extended))
    {$ELSE }
      !! MISSING !!
    {$ENDIF }
  END;
{$ENDIF }

如果可能的话,我也希望能够从MacOS/Linux转换成16字节的“扩展”类型(除非16字节的大小“仅仅”是一个对齐,即。10字节填充到16)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-03 21:42:56

在David的帮助下,我在上面的评论中提出了这一点,并在这里提供了它以供将来参考:

代码语言:javascript
复制
TYPE
  TExtended     = TExtended80Rec;
  PExtended     = ^TExtended;

{$IF SizeOf(Extended)=SizeOf(TExtended) }
PROCEDURE ExtendedToIntel(VAR D : Extended ; VAR E : TExtended); INLINE;
  BEGIN
    D:=Extended(E)
  END;

PROCEDURE IntelToExtended(VAR E : TExtended ; VAR D : Extended); INLINE;
  BEGIN
    E:=TExtended(D)
  END;
{$ELSEIF DEFINED(WIN64) }
PROCEDURE ExtendedToIntel(VAR D : Extended {Double} ; VAR E : TExtended); ASSEMBLER;
  ASM
                FLD     QWORD PTR [RCX]
                FSTP    TBYTE PTR [RDX]
                FWAIT
  END;

PROCEDURE IntelToExtended(VAR E : TExtended ; VAR D : Extended {Double} ); ASSEMBLER;
  ASM
                FLD     TBYTE PTR [RCX]
                FSTP    QWORD PTR [RDX]
                FWAIT
  END;
{$ELSE }
PROCEDURE ExtendedToIntel(D : Extended ; VAR E : TExtended);
  BEGIN
    PExtended(@E)^:=TExtended(D)
  END;

PROCEDURE IntelToExtended(CONST E : TExtended ; VAR D : Extended);
  BEGIN
    D:=Double(PExtended(@E)^)
  END;
{$ENDIF }

TYPE
  TStreamHelper = CLASS HELPER FOR TStream
                    FUNCTION ReadExtended : Extended;
                    PROCEDURE WriteExtended(E : Extended);
                  END;

{$IF SizeOf(Extended)=SizeOf(TExtended) }
FUNCTION TStreamHelper.ReadExtended : Extended;
  BEGIN
    Read(Result,SizeOf(Extended))
  END;

PROCEDURE TStreamHelper.WriteExtended(E : Extended);
  BEGIN
    Write(E,SizeOf(Extended))
  END;
{$ELSE }
FUNCTION TStreamHelper.ReadExtended : Extended;
  VAR
    EX  : TExtended;

  BEGIN
    Read(EX,SizeOf(TExtended));
    IntelToExtended(EX,Result)
  END;

PROCEDURE TStreamHelper.WriteExtended(E : Extended);
  VAR
    EX  : TExtended;

  BEGIN
    ExtendedToIntel(E,EX);
    Write(EX,SizeOf(EX))
  END;
{$ENDIF }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59987358

复制
相关文章

相似问题

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