日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

缓存和字符串相互转换

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 缓存和字符串相互转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用方法:將緩存中數據轉換成字符串并且進行了加密,然后將加密后的字符串通過SOCKET通信傳輸,接收方收到后,將字符串解密并且還原出數據。

可單獨用于結構體的序列也可用于結構體序列+有規則字符串的序列,看似簡單,其實萬能而通用,有許多游戲都是這么傳數據的,無非是改一改加密和解密的算法罷了。

unit EDcode;
//編碼/解碼函數庫
{$WARNINGS OFF}
interface

uses
?? Windows, SysUtils, Classes;

const
? BUFFERSIZE=32768;
? DEFBLOCKSIZE=24;

? HEADCHAR = '#';
? TAILCHAR = '!';

const
? CM_TEST = 1000;
? CM_TEST2 = 1001;

const
? SM_TEST = 9000;
? SM_TEST2 = 9001;

type
? TDefaultMessage=packed record? //Size=18
??? MsgID: word;
??? Param1: Integer;
??? Param2: integer;
??? Param3: integer;
??? Param4: Integer;
? end;

?? function EncodeMessage (smsg: TDefaultMessage): AnsiString;
?? function DecodeMessage (str: AnsiString): TDefaultMessage;
?? function EncodeString (str: AnsiString): AnsiString;
?? function DecodeString (str: AnsiString): AnsiString;
?? function EncodeBuffer (buf: PAnsiChar; bufsize: integer): AnsiString;
?? procedure DecodeBuffer (src: AnsiString; buf: PAnsiChar; bufsize: integer);

?? function? MakeDefaultMsg (msgid:word; param1,param2,param3,param4:integer):TDefaultMessage;
var
?? CSEncode: TRTLCriticalSection;

implementation

var
?? EncBuf, TempBuf: PAnsiChar;

function? MakeDefaultMsg (msgid:word; param1,param2,param3,param4:integer):TDefaultMessage;
begin
??? result.MsgID := msgid;
??? result.Param1 := param1;
??? result.Param2 := param2;
??? result.Param3 := param3;
??? result.Param4 := param4;
end;

procedure Encode6BitBuf (src, dest: PAnsiChar; srclen, destlen: integer);
var
?? i, restcount, destpos: integer;
?? made, ch, rest: byte;
begin
? try
?? restcount := 0;
?? rest ?? := 0;
?? destpos? := 0;
?? for i:=0 to srclen - 1 do begin
????? if destpos >= destlen then break;
????? ch := byte (src[i]);
????? made := byte ((rest or (ch shr (2+restcount))) and $3F);
????? rest := byte (((ch shl (8 - (2+restcount))) shr 2) and $3F);
????? Inc (restcount, 2);

????? if restcount < 6 then begin
????? ?dest[destpos] := AnsiChar(made + $3C);
???????? Inc (destpos);
????? end else begin
????? ?if destpos < destlen-1 then begin
??????????? dest[destpos]?? := AnsiChar(made + $3C);
??????????? dest[destpos+1] := AnsiChar(rest + $3C);
??????????? Inc (destpos, 2);
???????? end else begin
??????????? dest[destpos]?? := AnsiChar(made + $3C);
??????????? Inc (destpos);
???????? end;
???????? restcount := 0;
???????? rest := 0;
????? end;

?? end;
?? if restcount > 0 then begin
?? ?dest[destpos] := AnsiChar (rest + $3C);
????? Inc (destpos);
?? end;
?? dest[destpos] := #0;
? except
? end;
end;

procedure Decode6BitBuf (source: AnsiString; buf: PAnsiChar; buflen: integer);
const
?Masks: array[2..6] of byte = ($FC, $F8, $F0, $E0, $C0);
var
?? i, len, bitpos, madebit, bufpos: integer;
?? ch, tmp, _byte: Byte;
begin
try
?? len := Length (source);
?? bitpos? := 2;
?? madebit := 0;
?? bufpos? := 0;
?? tmp?? := 0;
?? for i:=1 to len do begin
????? if Integer(source[i]) - $3C >= 0 then
?? ? ch := Byte(source[i]) - $3C
????? else begin
???????? bufpos := 0;
????? ?break;
????? end;

????? if bufpos >= buflen then break;

????? if (madebit+6) >= 8 then begin
???????? _byte := Byte(tmp or ((ch and $3F) shr (6-bitpos)));
??????? ?buf[bufpos] := AnsiChar(_byte);
???????? Inc (bufpos);
???????? madebit := 0;
???????? if bitpos < 6 then Inc (bitpos, 2)
???????? else begin
???????? ?bitpos := 2;
??????????? continue;
???????? end;
????? end;

????? tmp := Byte (Byte(ch shl bitpos) and Masks[bitpos]);??
????? Inc (madebit, 8-bitpos);
?? end;
?? buf [bufpos] := #0;
except
end;
end;


function DecodeMessage (str: AnsiString): TDefaultMessage;
var
?? msg: TDefaultMessage;
begin
?? try
????? EnterCriticalSection (CSencode);
????? Decode6BitBuf (str, EncBuf, 1024);
????? Move (EncBuf^, msg, sizeof(TDefaultMessage));
????? Result := msg;
?? finally
?? ?LeaveCriticalSection (CSencode);
?? end;
end;


function DecodeString (str: AnsiString): AnsiString;
begin
?? try
????? EnterCriticalSection (CSencode);
????? Decode6BitBuf (str, EncBuf, BUFFERSIZE);
????? Result := StrPas (EncBuf);
?? finally
????? LeaveCriticalSection (CSencode);
?? end;
end;

procedure DecodeBuffer (src: AnsiString; buf: PAnsiChar; bufsize: integer);
begin
?? try
????? EnterCriticalSection (CSencode);
????? Decode6BitBuf (src, EncBuf, BUFFERSIZE);
????? Move (EncBuf^, buf^, bufsize);
?? finally
?? ?LeaveCriticalSection (CSencode);
?? end;
end;


function? EncodeMessage (smsg: TDefaultMessage): AnsiString;
begin
?? try
????? EnterCriticalSection (CSencode);
????? Move (smsg, TempBuf^, sizeof(TDefaultMessage));
????? Encode6BitBuf (TempBuf, EncBuf, sizeof(TDefaultMessage), 1024);
????? Result := StrPas (EncBuf);?
?? finally
?? ?LeaveCriticalSection (CSencode);
?? end;
end;


function EncodeString (str: AnsiString): AnsiString;
begin
?? try
????? EnterCriticalSection (CSencode);
????? Encode6BitBuf (PAnsiChar(str), EncBuf, Length(str), BUFFERSIZE);
????? Result := StrPas (EncBuf);
?? finally
????? LeaveCriticalSection (CSencode);
?? end;
end;


function? EncodeBuffer (buf: PAnsiChar; bufsize: integer): AnsiString;
begin
?? try
????? EnterCriticalSection (CSencode);
????? if bufsize < BUFFERSIZE then begin
???????? Move (buf^, TempBuf^, bufsize);
???????? Encode6BitBuf (TempBuf, EncBuf, bufsize, BUFFERSIZE);
???????? Result := StrPas (EncBuf);
????? end else
???????? Result := '';
?? finally
?? ?LeaveCriticalSection (CSencode);
?? end;
end;

initialization
begin
?? GetMem (EncBuf, BUFFERSIZE + 100);
?? GetMem (TempBuf, 2048);
?? InitializeCriticalSection(CSEncode);
end;


finalization
begin
? FreeMem (EncBuf, BUFFERSIZE + 100);
? FreeMem (TempBuf, 2048);
? DeleteCriticalSection(CSEncode);
end;


end.

轉載于:https://www.cnblogs.com/hnxxcxg/p/4888966.html

總結

以上是生活随笔為你收集整理的缓存和字符串相互转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。