已知字符串转为Byte数组的编码,求根据byte数组解码出字符串

Yothan 2015-06-23 01:43:17
CDMA短信机发送的问题,之前有发几个贴提问过。发送的时候会将汉字经过算法转为一个Byte数组,能正确发送并显示到手机中。现在需要接受中文短信,可却一直没有办法将byte数组转译回汉字。
技术能力有限,求大神们发挥你们的聪明才智,在已知汉字转为byte数组的规则下,将byte数组转译回来!
可追加分数!!

type
arrByte = array of byte;


function UnicodeEncodes(s: widestring) : string;
var
i,len : Integer;
cur : Integer;
t : String;
begin
result := '';
len := Length(s);
i := 1;
while i <= len do
begin
cur := ord(s[i]);
FmtStr(t,'%4.4X',[cur]);
result := result + t;
inc(i);
end;
end;

Function DXConvertUnicode(const ChineseStr: WideString): arrByte;
var
i, k, bNo, code: LongInt;
strTotal: arrByte;
n, n1: string;
begin
k := Length(ChineseStr);
SetLength(strTotal, k*2);
strTotal[0] := 00;
bNo := 0;
For i := 1 To k do
begin
n1 := Copy(ChineseStr, i, 1);
n := UnicodeEncodes(n1);
code := StrToInt('$' + n);
strTotal[bNo] := Code div 256;
strTotal[bNo + 1] := Code And 255;
bNo := bNo + 2;
end;
Result := strTotal;
end;
...全文
250 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
缘中人 2015-06-23
  • 打赏
  • 举报
回复
这是delphi版,自己测试正常
function unicodeToWord(abts: TBytes): string;
var
  strout: string;
  ahex: Integer;
  i, j: Integer;
begin
  // 字符串
  SetLength(strout, Length(abts) div 2);
  i := 0;
  j := 1;
  while i < Length(abts) - 1 do
  begin
    ahex := abts[i];
    ahex := ahex shl 8;
    ahex := ahex + abts[i + 1];

    strout[j] := Char(ahex);
    i := i + 2;
    inc(j)
  end;
  result := strout;
end;
  • 打赏
  • 举报
回复
这个算法,数组是按照big endian顺序存储unicode的高低字节的,否则直接move就可以了。

function ByteArray2UnicodeString(const Arr: ArrByte; ArrBigEndian: boolean = true): WideString;
var
  i: integer;
  p: ArrByte;
begin
  SetLength(Result, Length(Arr) div 2);
  p := pointer(Result);

  if ArrBigEndian then
    for i := 1 to Length(Result) do
      begin
        p[i * 2 - 2] := Arr[i * 2 - 1];
        p[i * 2 - 1] := Arr[i * 2 - 2];
      end
  else
    move(Arr[0], p[0], Length(Result) * 2);
end;
缘中人 2015-06-23
  • 打赏
  • 举报
回复
这是c++版
	// 字符串
	String strOut;
	strOut.SetLength(bts.Length / 2);
	int ahex;
	for (int i = 0, j = 1; i < bts.Length; j++)
	{
		ahex = bts[i];
		ahex = ahex << 0x8;
		ahex += bts[i + 1];

		strOut[j] = ahex;
		i += 2;
	}
	Caption = strOut;
缘中人 2015-06-23
  • 打赏
  • 举报
回复
全部是汉字?
zzmaljy1 2015-06-23
  • 打赏
  • 举报
回复
我就是西周,我只是来卖萌的,也能混到分么>_<
Yothan 2015-06-23
  • 打赏
  • 举报
回复
比如汉字:“测试”,通过DXConvertUnicode函数,返回的byte数组为:(109, 75, 139, 213) 现在需要将 数组内容为 (109, 75, 139, 213) 的byte数组 转为汉字 “测试”

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧