关于从流中读入字节的问题(100分)

  • 主题发起人 主题发起人 fly-king
  • 开始时间 开始时间
F

fly-king

Unregistered / Unconfirmed
GUEST, unregistred user!
[blue]我的程序需要从一个流中读入字节,我利用了TMemoryStream的ReadBuffer,
这样读入的信息是出现了这样的问题,就是字节的顺序是反的。比如磁盘上的
$CAFEBABE,读入以后呢,变成了$BEBAEFCA.
我把读入的结果放到了一个字节的数组中,顺序调整好了,却不知道怎么把这个结果
放到TMemoryStream的返回值Buffer中(因为ReadBuffer的定义是这样的
procedure ReadBuffer(var Buffer
Count: Longint);)
曾经利用move(byteArr,Count,Sizeof(byteArr))进行传递,可是没有传递成功。
现在我的问题可以在2个方面进行解决:
第一,怎样使读入的信息的顺序是正确的?
第二,怎样对于没有类型的数据进行赋值?


[/blue]
 
1,看他怎么写!
2,用变体类型 variant,不过开销比较大!
 
B : array[0..10] of Byte;
S : TMemoryStream;

S.ReadBuffer(B, SizeOf(B));
 
这和声明的 buffer 的数据类型有关。
要顺来,可以声明 buffer:integer;
 
这个问题我自己已经解决。利用的是最笨的办法,每次读来的数据都进行一次的逆转
首先,在单元的初始化的位置,加入一个判断。看是否需要逆转buffer的顺序。
Const
TestStr = 'CAFEBABE';
//在磁盘上字符串JAVA对应的存储二进制码应该是4341464542414145
var
FileName:String;
MyFile:TextFile;
ThisInt:Int64;

TempStream:TFileStream;
initialization
{ Initialization section goes here }
begin
fileName := ExtractFilePath(Application.ExeName)+'test.$$$';
AssignFile(MyFile,FileName);
Rewrite(MyFile);
Writeln(MyFile,TestStr);
CloseFile(MyFile);

TempStream:= TFileStream.Create(FileName,fmOpenRead );
TempStream.ReadBuffer(ThisInt,4);

case ThisInt of
$46454341{FECA},$45464143{EFAC}:
begin
{$DEFINE NeedTranslate};
//Application.MessageBox('反了','');
YouCanSee:=False;
end;
//$4341464542414145 :
$43414645:
begin
//Application.MessageBox('好的','');
YouCanSee:=True;
end;
else
{$DEFINE UnIdenticalOS}
//Application.MessageBox('惨了','');
end;

//{$IFDEF NeedTranslate}
// Application.MessageBox('','');
//{$ENDIF}

TempStream.Free;
DeleteFile(FileName);
end;

然后,自己写了这样的一段代码
function classfile.ReverseBuffer(Source: Int64): Int64;
var
thisBuffer:Int64;
TempRes:Int64;
begin
if YouCanSee then
begin
Result := Source;
end
else
begin
thisBuffer := Source;
TempRes:= 0;
while thisBuffer >255 do
begin
TempRes := TempRes * 256 + thisBuffer mod 256;
thisBuffer := thisBuffer div 256;
//Application.MessageBox(pchar(InttoHex(TempRes,4)),'');
end;

TempRes := TempRes*256 + thisBuffer;
Result := TempRes;
end;
end;

function classfile.ReverseBuffer(Source: Integer): Integer;
var
thisBuffer:LongInt;
thisTempRes:LongInt;
begin
if YouCanSee then
begin
Result := Source;
end
else
begin
thisBuffer := Source;
thisTempRes := 0;
while thisBuffer >255 do
begin
thisTempRes := thisTempRes * 256 + thisBuffer mod 256;
thisBuffer := thisBuffer div 256;
end;

thisTempRes := thisTempRes + thisBuffer;

Result := thisTempRes;
end;
end;
在每一个读入的字节流后,都进行逆转,很笨
 
多人接受答案了。
 
后退
顶部