Delphi 替换TMemoryStream中的字节
我正在通过internet以TmemoryStream的形式发送数据,现在我想用一个简单的算法对它进行加密 因此,我考虑替换tmemorystream中的每个字节来对其进行编码 看起来像 eg(以字节为单位的内存流): [123][233][122][001][123][233][122][001][123][233][122][001] eg(ascii密码) 嗨=[72][73] 说明 [123+72][233+73][122+72][001+73][123+72][233+73][122+72][001+73][123+72][233+73][122+72][001+73] 最终值 [195][51][194][74] 如何使用Delphi在单个解析中进行这种替换 和 如何在单个解析中替换memeorystream中的字节以实现此目的 ===============================更新==============================================Delphi 替换TMemoryStream中的字节,delphi,Delphi,我正在通过internet以TmemoryStream的形式发送数据,现在我想用一个简单的算法对它进行加密 因此,我考虑替换tmemorystream中的每个字节来对其进行编码 看起来像 eg(以字节为单位的内存流): [123][233][122][001][123][233][122][001][123][233][122][001] eg(ascii密码) 嗨=[72][73] 说明 [123+72][233+73][122+72][001+73][123+72][233+73][122+
var pq: integer ;
....
LLine := // from a stream
//start blocjk
//my encription
p := LLine.Memory;
for i := 0 to LLine.Size-1 do
begin
pp := p^ ;
pq := pp + 72 ;
if pq > 255 then
begin
pq := pq - 255 ;
end;
P^ := Byte(pq) ;
inc(p);
end;
// my encription end
//my decription
LLine.Position := 0;
p := LLine.Memory;
for i := 0 to LLine.Size-1 do
begin
pp := p^ ;
pq := pp - 72 ;
if pq < 0 then
begin
pq := pq + 255 ;
end;
P^ := Byte(pq) ;
inc(p);
end;
//end
//end blocjk
Image1.Picture.Graphic.LoadFromStream(LLine);
var-pq:整数;
....
LLine:=//来自流
//启动blocjk
//我的描述
p:=线性记忆;
对于i:=0到LLine.Size-1 do
开始
pp:=p^;
pq:=pp+72;
如果pq>255,则
开始
pq:=pq-255;
结束;
P^:=字节(pq);
公司(p),;
结束;
//我的咒语结束了
//我的描述
直线位置:=0;
p:=线性记忆;
对于i:=0到LLine.Size-1 do
开始
pp:=p^;
pq:=pp-72;
如果pq<0,则
开始
pq:=pq+255;
结束;
P^:=字节(pq);
公司(p),;
结束;
//结束
//端块
图像1.图片.图形.加载源流(LLine);
TMemoryStream
公开一个名为的属性,该属性指向流的第一个字节。所以你可以这样做:
var
i: Integer;
p: ^Byte;
...
p := MemoryStream.Memory;
for i := 0 to MemoryStream.Size-1 do
begin
EncryptByte(p^);
inc(p);
end;
procedure EncryptByte(var b: Byte);
p := MemoryStream.Memory;
for i := 0 to MemoryStream.Size-1 do
begin
inc(p^, 72 + (i mod 2));
inc(p);
end;
其中EncryptByte
的定义如下:
var
i: Integer;
p: ^Byte;
...
p := MemoryStream.Memory;
for i := 0 to MemoryStream.Size-1 do
begin
EncryptByte(p^);
inc(p);
end;
procedure EncryptByte(var b: Byte);
p := MemoryStream.Memory;
for i := 0 to MemoryStream.Size-1 do
begin
inc(p^, 72 + (i mod 2));
inc(p);
end;
并修改了传递的字节
对于简单的加密方案,您可以编写如下代码:
var
i: Integer;
p: ^Byte;
...
p := MemoryStream.Memory;
for i := 0 to MemoryStream.Size-1 do
begin
EncryptByte(p^);
inc(p);
end;
procedure EncryptByte(var b: Byte);
p := MemoryStream.Memory;
for i := 0 to MemoryStream.Size-1 do
begin
inc(p^, 72 + (i mod 2));
inc(p);
end;
我在这里有点懒,直接将修改写到循环中,因为它需要了解当前索引
您需要确保此代码块的范围检查已禁用
在更新的问题中,代码中的错误是需要按
256
而不是255
进行移位
if pq > 255 then
begin
pq := pq - 256;
end;
...
if pq < 0 then
begin
pq := pq + 256;
end;
如果pq>255,则
开始
pq:=pq-256;
结束;
...
如果pq<0,则
开始
pq:=pq+256;
结束;
如何将包装好的[233+73]->[51]分解回[233+73]?@AlexK。你能从51中减去73吗(73是passowrd中的一个字符),否则它会减少25的22。我不喜欢你的算法。最好使用XOR加密,或者更好地使用真正的流加密,比如RC4,它很容易实现。如果我有这个任务,我不会替换TMemoryStream内容。相反,我会编写一个TStream包装器,给包装器一个对内存流的引用,然后给包装器一个以前接收内存流的代码。当消费者调用包装器上的Read
时,包装器将调用包装流上的Read
,“加密”结果,然后返回给调用者。包装的流可以是任何内容,包括TMemoryStream、TFileStream、TResourceStream或其他一些尚未编写的流类。@kobik您还想要什么?关于如何实现加密的想法?@vibeeshanRC您可以使用一个简单的XOR加密算法,有许多delphi示例。@vibeeshanRC inc(p)很好,我的答案中的代码也很好。内存流只是一块内存。我获取指向该块第一个字节的指针的副本,然后逐步遍历它<代码>位置是将其视为流并调用Read
和Write
时使用的位置p^:=value
会起作用,但答案中的代码也会起作用。我不知道你的代码有什么问题。在你发明的一些琐碎数据上测试加密。然后应用于jpg文件。我可以问你为什么要设置这个位置吗?@kobik我也回答了后续问题。原来没那么难!