首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

大小端的转换有关问题?

2013-10-25 
大小端的转换问题?急!不知在delphi中是怎样的转换,如456用EncodeUniCode转成USC2就是0034 0035 0036的小端

大小端的转换问题?急!
不知在delphi中是怎样的转换,如456用EncodeUniCode转成USC2就是0034 0035 0036的小端方式,而我现在要大端方式即3400 3500 3600的方式,不知怎样的转,delphi中没有现成的函数样的。网上只能查到C的转换方式,也看不懂,不知是对与错,但也不知怎样转为delphi的方式。C的方式如下:
void convertToLittleEndian(unsigned int *data)
{
   *data = ((*data & 0xff000000) >> 24)
         | ((*data & 0x00ff0000) >>  8)
         | ((*data & 0x0000ff00) <<  8)
         | ((*data & 0x000000ff) << 24)

[解决办法]
乘256???
[解决办法]

procedure convertToLittleEndian(var i32:Longword)
var
  p,p2:pbyte;
  b:byte;
begin
  p:=pbyte(@i32);
  p2:=p; inc(p2,4);
  b:=p^; p^:=p2^; p2^:=b;

  inc(p); p2:=p; inc(p2);
  b:=p^; p^:=p2^; p2^:=b;
end;

[解决办法]

//这段代码是直接根据你的C代码翻译的
procedure convertToLittleEndian(var int : DWORD);
begin
  int := ((int and $ff000000) SHR 24)
          or ((int and $00ff0000) SHR  8)
          or ((int and $0000ff00) SHL  8)
          or ((int and $000000ff) SHL 24);
end;

//这个代码就不说了,上面的函数搞半天,其实就是一行指令.
function convertToLittleEndian2(dw : DWORD) : DWORD;
asm
  BSWAP EAX
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  n1 , n2 : DWORD;
begin
  n1 := $12345678;
  n2 := $12345678;
  convertToLittleEndian(n1);
  n2 := convertToLittleEndian2(n2);
  if n1=n2 then
    Caption := 'OK';


题外话,楼主用这个函数转换,其实不是很得体

热点排行