我通过互联网发送数据作为TmemoryStream,现在我想用简单的算法加密它。
所以我考虑将tmemorystream中的每个字节替换为encript。
看起来像
例如(一个以字节为单位的memoryStream):
[123] [233] [122] [001] [123] [233] [122] [001] [123] [233] [122] [001]
例如(ascii中的密码)
hi = [72] [73]
encription
[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中的字节以实现此目的。
======================= update ======================= =======================
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);
答案 0 :(得分:10)
TMemoryStream
公开名为Memory
的属性,该属性指向流的第一个字节。所以你可以这样做:
var
i: Integer;
p: ^Byte;
...
p := MemoryStream.Memory;
for i := 0 to MemoryStream.Size-1 do
begin
EncryptByte(p^);
inc(p);
end;
EncryptByte
的定义如下:
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;