关于tstream的二进制位操作?(100分)

  • 主题发起人 主题发起人 fzbear
  • 开始时间 开始时间
F

fzbear

Unregistered / Unconfirmed
GUEST, unregistred user!
问题描述:
我想利用tstream类,比如tmemorystream先读取一个文件,
然后想将这个文件转化为array of byte,然后读取并操作
array of byte数组中的位。或者就直接读取这个stream中
的位,即010101形式的数据。然后希望将两个byte类型的
数据进行位运算,将byte2的前两位写入byte1的最后两位,
其他保留。
不知如何操作,似乎总是出现类型转换的问题,请告知。
谢谢!
 
可以先读出一个LONGINT,然后分四个字节BYTE进行位运算操作。
 
var
Memory: TMemoryStream;
a, b: Byte;
begin
Memory:=TMemoryStream.Create;
try
Memory.LoadFromFile('c:/jhd.txt');
Memory.Position:=0;
Memory.Read(a, 1);
ShowMessage(IntToStr(a));
a:=a shr 1;
//...位操作
ShowMessage(IntToStr(a));
Memory.Read(b, 1);
ShowMessage(IntToStr(b));
finally
Memory.Free;
end;
end;
 
非常感谢Jhdandcl的答复,我想询问一下,
如何循环读出stream中的byte,另外,是不是
所有文件的最小单位都是byte吧!
 
var
a:byte;
i:integer;
begin
for i:=0 to stream.size-1 do
begin
stream.Read(a, 1);
...
end;

所有文件的最小单位都是byte!对
 
谢谢Jhdandcl的答复,再向您请教一下:
如果一位一位的读取byte,显然效率是不高的,
我想即使进行位操作时,也肯定是以array of byte
的形式读取的,能否给出array的代码。
这是我关于这个问题的最后一点疑问。
 
我认为最好建一个缓冲区,一次读入一个固定的长度的数据,分析这个缓冲里的数据
不要一次读一个BYTE,楼上说对,这样做效率太低了
 
张兄弟既然来了,就给个代码的例子吧,我绝对
是眼高手低的人,只会读程序,东抄点,西抄点,
真正自己写程序,真是写不出来,即便写了,也
总出错,所以才麻烦各位朋友帮忙
 
var
Memory: TMemoryStream;
a, b: Byte;
c:array[1..256] of Byte;
j,d:Integer;
begin
Memory:=TMemoryStream.Create;
try
Memory.LoadFromFile('c:/jhd.txt');
Memory.Position:=0;
Memory.Read(a, 1);
d:=Memory.Read(c,256);
a:=a shr 1;
for j:=1 to d do
begin
a:=c[j];
a:=a shr 1;
//...位操作
end;
//...位操作
Memory.Read(b, 1);
ShowMessage(IntToStr(b));
finally
Memory.Free;
end;
end;
 
如果流以array of byte的方式读出,是不是要
(memorystream.size) div (array of byte's size),然
后判断余数,确定分段数再循环读出?

是不是每调用一次memeorystream.read或write。memorys
tream的指针就会移动read,write数据大小的偏移量?

其实我按照Jhdandcl兄弟的方法是实现了两个流之间逐位
的位运算,但是我发现速度确实很慢,如果要提高速度,
只能从流中各读取一段数据,然后再对这段数据分别进行
循环的位操作,写这种嵌套循环的逻辑还是非常容易搞乱

假设流的大小不大,一次性都读入array of byte,这种
数组最多可以装多大的数据?


 
用文件映射速度很快,系统自动处理分页等一些功能,建议你用文件映射
 
后退
顶部