delphi7 idTcpServer 怎么以十六进制模式发送中英文混合的字符串(对方只能接收十六进制的数据)?在线急
//--------------------此函数可把汉字或字符转化成16进制字符串输出--------------------------------------fun...
//--------------------此函数可把汉字或字符转化成16进制字符串输出--------------------------------------
function Tfrmserver.StrtoHex(Str:String):String;
var
cc:string; //定义变量
bin:string;
intStringSend,i:integer;
strcount:string;
strlist:TStringList;
begin
strlist:=TStringList.Create;
ExtractStrings([' '], [' '], pchar(trim(Str)), strlist);
for i:=0 to strlist.Count-1 do
begin
strcount:=strcount+ strlist.Strings[i];
end;
cc:=leftstr(trim(strcount),1472);
intStringSend:= length(cc);
if (intStringSend mod 2<>0) then
begin
cc:=leftstr(cc,intstringsend-1) + '0' + rightstr(cc,1);
intstringsend:=intstringsend +1;
end;
SetLength(bin,intStringSend);
Result:=bin;;
end ;
我搜了一下用这个方法,发现最后一个字符会变成?,不知道什么原因 展开
function Tfrmserver.StrtoHex(Str:String):String;
var
cc:string; //定义变量
bin:string;
intStringSend,i:integer;
strcount:string;
strlist:TStringList;
begin
strlist:=TStringList.Create;
ExtractStrings([' '], [' '], pchar(trim(Str)), strlist);
for i:=0 to strlist.Count-1 do
begin
strcount:=strcount+ strlist.Strings[i];
end;
cc:=leftstr(trim(strcount),1472);
intStringSend:= length(cc);
if (intStringSend mod 2<>0) then
begin
cc:=leftstr(cc,intstringsend-1) + '0' + rightstr(cc,1);
intstringsend:=intstringsend +1;
end;
SetLength(bin,intStringSend);
Result:=bin;;
end ;
我搜了一下用这个方法,发现最后一个字符会变成?,不知道什么原因 展开
1个回答
展开全部
中文转成 array of byte 应该就是你想要的结果
以下是函数和转换例子
我就是这样用字节发送到网络上 和接收的
如果是 带中文的String 转byte
function UniCode2GB(S: string): string;
var I: Integer;
begin
I := Length(S);
while I >= 4 do begin
try
Result := WideChar(StrToInt('$' + S[I - 3] + S[I - 2] + S[I - 1] + S[I])) + Result;
except end;
I := I - 4;
end;
end;
function GB2UniCode(GB: string): string;
var
s: string;
i, j, k: integer;
a: array[1..160] of char;
begin
s := '';
StringToWideChar(GB, @(a[1]), 500);
i := 1;
while ((a[i] <> #0) or (a[i + 1] <> #0)) do begin
j := Integer(a[i]);
k := Integer(a[i + 1]);
s := s + Copy(Format('%X ', [k * $100 + j + $10000]), 2, 4);
//S := S + Char(k)+Char(j);
i := i + 2;
end;
Result := s;
end;
var
s1,name:string;
ByteArr: array of byte;
s1 := GB2UniCode(‘张飒www’);
for I := 0 to round(Length(s1) / 2) - 1 do //以下是转string byte array
begin
ByteArr[I] := StrToint('$' + SubStr(s1, I * 2 + 1, 2));
end;
for I := 0 to len do //以下是byte array 转 string 支持中文
begin
Name := Name + IntToHex(ByteArr[I], 2);
end;
Name := UniCode2GB(Name);
以上是带中文的string 转 byte array 和 byte array 转 String
同样可以支持不带中文的string 和array转换
如果是你用字节方式发送 那就
1 GB2UniCode
2 发送
接收以后
1 转HEX字符串
for I := 0 to len do //以下是byte array 转 string 支持中文
begin
Name := Name + IntToHex(ByteArr[I], 2);
end;
Name := UniCode2GB(Name);
2 UniCode2GB 转String
如果你用String方式发送
1 GB2UniCode
2
for I := 0 to len do //以下是byte array 转 string 支持中文
begin
Name := Name + IntToHex(ByteArr[I], 2);
end;
Name := UniCode2GB(Name);
直接发送Name Name就是16进制的
接收就是 UniCode2GB
以下是函数和转换例子
我就是这样用字节发送到网络上 和接收的
如果是 带中文的String 转byte
function UniCode2GB(S: string): string;
var I: Integer;
begin
I := Length(S);
while I >= 4 do begin
try
Result := WideChar(StrToInt('$' + S[I - 3] + S[I - 2] + S[I - 1] + S[I])) + Result;
except end;
I := I - 4;
end;
end;
function GB2UniCode(GB: string): string;
var
s: string;
i, j, k: integer;
a: array[1..160] of char;
begin
s := '';
StringToWideChar(GB, @(a[1]), 500);
i := 1;
while ((a[i] <> #0) or (a[i + 1] <> #0)) do begin
j := Integer(a[i]);
k := Integer(a[i + 1]);
s := s + Copy(Format('%X ', [k * $100 + j + $10000]), 2, 4);
//S := S + Char(k)+Char(j);
i := i + 2;
end;
Result := s;
end;
var
s1,name:string;
ByteArr: array of byte;
s1 := GB2UniCode(‘张飒www’);
for I := 0 to round(Length(s1) / 2) - 1 do //以下是转string byte array
begin
ByteArr[I] := StrToint('$' + SubStr(s1, I * 2 + 1, 2));
end;
for I := 0 to len do //以下是byte array 转 string 支持中文
begin
Name := Name + IntToHex(ByteArr[I], 2);
end;
Name := UniCode2GB(Name);
以上是带中文的string 转 byte array 和 byte array 转 String
同样可以支持不带中文的string 和array转换
如果是你用字节方式发送 那就
1 GB2UniCode
2 发送
接收以后
1 转HEX字符串
for I := 0 to len do //以下是byte array 转 string 支持中文
begin
Name := Name + IntToHex(ByteArr[I], 2);
end;
Name := UniCode2GB(Name);
2 UniCode2GB 转String
如果你用String方式发送
1 GB2UniCode
2
for I := 0 to len do //以下是byte array 转 string 支持中文
begin
Name := Name + IntToHex(ByteArr[I], 2);
end;
Name := UniCode2GB(Name);
直接发送Name Name就是16进制的
接收就是 UniCode2GB
更多追问追答
追问
有点看不懂,我的意思是,比方说对发发来一个信息,我服务端处理后,返回一个信息;AThread.Connection.write(str);但是必须已十六进制模式发送的,比方说我上面用到的方法:AThread.Connection.write(StrtoHex(‘|晨点已经结束'));但是发现对方接收后最后一个‘束’字是乱码。
追答
如果是最后一个字符是乱码
要么是你取字符的时候 少取一个 导致束字 只取了一半(汉字是2个字符)
我没仔细看你代码 因为不直观
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询