替换TMemoryStream中的字节

时间:2012-01-17 11:39:51

标签: delphi

我通过互联网发送数据作为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);

1 个答案:

答案 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;