关于二进制文件读取,有意思。

useresu 2008-11-25 01:53:28
我想读取二进制文件,由于delphi最小数制单位为byte,即一个字节,
我现在想实现的是:
每次读取15位二进制,然后再在其首位加一个标志位'1',
然后再存成另一个文件.

举例如下:
原文件
01010101011111,010101010101010
处理后文件为:
101010101011111,1010101010101010

我不知道如何只读取15位,

如果每次读取2个Byte,则超出了15位,还有如何添加标志位.
...全文
202 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
android2008 2008-11-27
  • 打赏
  • 举报
回复
不懂,up
useresu 2008-11-27
  • 打赏
  • 举报
回复
多谢 jadeluo,
问题基本解决,
但还有个小问题,
L := R.Read(A[1], 30);这句,我读到word类型中的两个byte怎么高低位是反的。
本来我的文件中是: 5599,结果读出来到A[i]中是9955,
导致最终结果不对。
还望再指点一下。
jadeluo 2008-11-26
  • 打赏
  • 举报
回复

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;
useresu 2008-11-26
  • 打赏
  • 举报
回复
自己顶一下
useresu 2008-11-26
  • 打赏
  • 举报
回复
to unsigned:
是:

把整个文件当中的数据每15bit组成一个新的Word,然后再在高位用1填充。

如果是前者,就不用这么麻烦了。其实C++很容易搞定的事,感觉delphi还是有其弱项,只有byte和word,。



拜托你一定帮忙看看。





yuqianyi1974 2008-11-25
  • 打赏
  • 举报
回复
1.每次读取30个字节,将30字节拆成16个15位二进制
2.不足30字节,补0或补1拆成15位二进制
僵哥 2008-11-25
  • 打赏
  • 举报
回复
建议还是先弄清楚,是直接把了个字(Word,双字节),的最高位使用1填充,还是说把整个文件当中的数据每15bit组成一个新的Word,然后再在高位用1填充。这是完全的两个概念。
useresu 2008-11-25
  • 打赏
  • 举报
回复
拜托各位了,如果分不够,可以加
useresu 2008-11-25
  • 打赏
  • 举报
回复
不足的话,无所谓,补0或者补1都可以
僵哥 2008-11-25
  • 打赏
  • 举报
回复
如果不足怎么办?

16,746

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧