代码之家  ›  专栏  ›  技术社区  ›  RobertFrank Picarus

如何转换大端和如何翻转最高位?

  •  4
  • RobertFrank Picarus  · 技术社区  · 16 年前

    我使用TStream读取二进制数据(感谢这篇文章: How to use a TFileStream to read 2D matrices into dynamic array?

    我的下一个问题是数据是大端的。据我所知,Swap()方法似乎已被弃用。如何交换下面的类型?

     16-bit two's complement binary integer
     32-bit two's complement binary integer
     64-bit two's complement binary integer
     IEEE single precision floating-point - Are IEEE affected by Big Endian?
    

    最后,由于数据是无符号的,所以这个数据集的创建者将无符号值存储为有符号整数(不包括IEEE)。它们指示只需添加偏移量(2^15、2^31和2^63)即可恢复无符号数据。但是,他们注意到翻转最重要的位是最快的方法。如何有效地翻转16、32或64位整数的最高有效位?

    因此,如果磁盘(16位)上的数据是“85fB”,那么在读取数据、交换和位翻转之后的期望结果将是1531。

    有没有一种方法可以通过泛型来完成交换和位翻转,这样就可以与上面链接中的泛型答案相匹配?

    2 回复  |  直到 9 年前
        1
  •  8
  •   kludg    16 年前

    function Flip16(const Value: Word): Word; inline;
    begin
      Result:= Value xor $8000;
    end;
    
    function Flip32(const Value: LongWord): LongWord; inline;
    begin
      Result:= Value xor $80000000;
    end;
    
    function Flip64(const Value: UInt64): UInt64; inline;
    begin
      Result:= Value xor $8000000000000000;
    end;
    
    function SwapBytes(Value: LongWord): Single;
    type
      Bytes = packed array[0..3] of Byte;
    
    begin
      Bytes(Result)[0]:= Bytes(Value)[3];
      Bytes(Result)[1]:= Bytes(Value)[2];
      Bytes(Result)[2]:= Bytes(Value)[1];
      Bytes(Result)[3]:= Bytes(Value)[0];
    end;
    

    更新

    function SwapBytes(Value: LongWord): Single; register; 
    asm
      BSWAP  EAX
    end;
    

    再次更新 :

    一个常见的做法是每个帖子一个问题-它通常会导致更好的答案。

    1) IEEE是否受到Big Endian的影响?

    2) 翻转一个最高有效位-答案已经给出,但由于你可能有大端号,你可能只需要翻转一个最低有效字节中的最高有效位,即只需xor$80;

    3) 从大端到小端的转换;

    对于16位值使用Swap函数-很难理解为什么delphi help说这个函数只用于向后兼容;也可以使用Remko注意到的XCHG asm指令;

    对于32位值,您可以使用我的代码或马可评论中的代码;

    function Swap64(Value: UInt64): UInt64;
    begin
      Result:= Swap32(LongWord(Value));
      Result:= (Result shl 32) or Swap32(LongWord(Value shr 32));
    end;
    

    4) 这里可以使用泛型吗?

    我认为这不是个好主意。

        2
  •  0
  •   Mason Wheeler    16 年前

    $80 对于一个字节, $8000 一句话,你猜对了, $80000000 为了一个双关语。