如何将little-endian二进制文件转换为Delphi Record类型

时间:2011-09-19 03:37:35

标签: delphi

有没有办法帮助将二进制文件转换为Delphi 5中的指定记录?而这个二进制文件是小端的。

1 个答案:

答案 0 :(得分:4)

Intel / AMD上的Windows也是小端,因此不需要进行字节序转换。

现在,如果您可以显示特定记录以及从何处获取二进制数据,则可以更轻松地回答。

您可以从文件中读取任何类型的记录。如果声明您的记录,使其与二进制数据具有完全相同的布局,则可以一次读取整个记录。如果没有,您将必须单独阅读每个字段。

通常,您可以使用

从流中读取记录或记录的各个字段
var
  MyStream: TStream;
...
  MyStream := TFileStream.Create(Filename, options);
...
  MyStream.Read(variable, sizeof(variable));

如果您的数据来自TCP套接字,您可以将其作为字节写入TMemoryStream。然后,您可以将流的指针重置为开头,并如图所示读取数据。

更新

正如David评论的那样,如果字节以网络字节顺序通过TCP连接,那么通过WinSock函数 ntohs() ntohl之一运行每个字段是有意义的( ),在完成上述所有操作之后,但在使用记录中的项目之前。 ntohs()转换2字节类型,而 ntohl()转换4字节类型。要发送项目,请在发送之前对记录中的每个项目使用反向函数 htons() htonl()。(单独)。

FWIW,在Win32中,使用以下方法更改字节顺序非常容易:

// byte swaps 32 bit values
function BSwap32(I: DWORD): DWORD; { inline; }
asm
        BSWAP   EAX
end;

// byte swaps 16 bit values
function BSwap16(I: WORD): WORD; { inline; }
asm
        XCHG    AL,AH
end;

// byte swaps 64 bit values
function BSwap64(I: QWORD): QWORD; { inline; }
asm
        MOV     EDX,[EAX]
        MOV     EAX,[EAX+4]
        BSWAP   EAX
        BSWAP   EDX
end;