Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 替换TMemoryStream中的字节_Delphi - Fatal编程技术网

Delphi 替换TMemoryStream中的字节

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+

我正在通过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中的字节以实现此目的

===============================更新==============================================

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我也回答了后续问题。原来没那么难!