我想读取二进制文件,由于delphi最小数制单位为byte,即一个字节,
我现在想实现的是:
每次读取15位二进制,然后再在其首位加一个标志位'1',
然后再存成另一个文件.举例如下:
原文件
01010101011111,010101010101010
处理后文件为:
101010101011111,1010101010101010我不知道如何只读取15位,如果每次读取2个Byte,则超出了15位,还有如何添加标志位.
我现在想实现的是:
每次读取15位二进制,然后再在其首位加一个标志位'1',
然后再存成另一个文件.举例如下:
原文件
01010101011111,010101010101010
处理后文件为:
101010101011111,1010101010101010我不知道如何只读取15位,如果每次读取2个Byte,则超出了15位,还有如何添加标志位.
解决方案 »
- 如何(控制)循环开启线程 ?
- 紧急求救:需要用SaveDialog备份文件夹,所以不需要该对话框的文件名和文件类型框,能否将它禁掉或不显示.
- 欢迎加入'东莞IT'QQ群:11904959
- 如何获得局域网内所有的SQL Server服务器名称?
- 关于Application.Terminate
- 怎么才能判断某一路径下有没有指定文件?急!
- 请问在ACCESS中做的报表,在DELPHI中可以调用吗
- 各位大俠進來看看,絕對值得關注意!!
- 请问怎样获得当前壁纸?(在ActiveDesktop Disable时)
- delphi6手册编制小组相关事宜
- 继承了TListview,搞了多列排序(按住Ctrl键,点列1,列2,列3等同时多列排序)。但觉得实现总是很别扭,关键是取不到Ctrl键消息。大家有兴趣一起看看。
- delphi 中too many actual parameters啥意思呢?
是:把整个文件当中的数据每15bit组成一个新的Word,然后再在高位用1填充。如果是前者,就不用这么麻烦了。其实C++很容易搞定的事,感觉delphi还是有其弱项,只有byte和word,。拜托你一定帮忙看看。
type
TMyArray = array[0..16] of Word;function ExpandArray(A: TMyArray; L: Integer): TMyArray;
var
i : Integer;
begin
A[0] := 0;
A[16] := 0;
FillChar(Result, SizeOf(Result), 0);
for i := 1 to L do
Result[i] := (A[i] shr i) or (A[i-1] shl (16 - i)) or $8000;
end;procedure TForm1.Button1Click(Sender: TObject);
var
R, W: TFileStream;
A, B: TMyArray;
L : Integer;
begin
R := TFileStream.Create('d:\1', fmOpenRead);
try
W := TFileStream.Create('d:\2', fmCreate);
try
R.Position := 0;
repeat
FillChar(A, SizeOf(A), 0);
L := R.Read(A[1], 30);
if L > 0 then
begin
if odd(L) then inc(L);
B := ExpandArray(A, L);
W.WriteBuffer(B[1], L + 2);
end;
until L < 30;
finally
W.Free;
end;
finally
R.Free;
end;
end;
问题基本解决,
但还有个小问题,
L := R.Read(A[1], 30);这句,我读到word类型中的两个byte怎么高低位是反的。
本来我的文件中是: 5599,结果读出来到A[i]中是9955,
导致最终结果不对。
还望再指点一下。