200 分请翻译一个函数,C++ 到 Delphi ( 积分: 200 )

  • 主题发起人 主题发起人 ztaif
  • 开始时间 开始时间
Z

ztaif

Unregistered / Unconfirmed
GUEST, unregistred user!
int CSmsExampleDlg::gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
int nDstLength
// UNICODE宽字符数目
WCHAR wchar[128]
// UNICODE串缓冲区

// 字符串-->UNICODE串
nDstLength = ::MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128);

// 高低字节对调,输出
for(int i=0
i<nDstLength
i++)
{
// 先输出高位字节
*pDst++ = wchar >> 8;
// 后输出低位字节
*pDst++ = wchar &amp
0xff;
}
*pDst='/0';
// 返回目标编码串长度
return nDstLength * 2

}

int CSmsExampleDlg::gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
int nDstLength
// UNICODE宽字符数目
WCHAR wchar[128]
// UNICODE串缓冲区

// 高低字节对调,拼成UNICODE
for(int i=0
i<nSrcLength/2
i++)
{
// 先高位字节
wchar = *pSrc++ << 8;
// 后低位字节
wchar |= *pSrc++;
}
// UNICODE串-->字符串
nDstLength = ::WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL);
// 输出字符串加个结束符
pDst[nDstLength] = '/0'

// 返回目标字符串长度
return nDstLength;
}


自己试了一下,翻译过来不能用,不明白那里有问题,请懂C++ 和Delhpide的兄弟帮帮忙翻译一下
 
int CSmsExampleDlg::gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
int nDstLength
// UNICODE宽字符数目
WCHAR wchar[128]
// UNICODE串缓冲区

// 字符串-->UNICODE串
nDstLength = ::MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128);

// 高低字节对调,输出
for(int i=0
i<nDstLength
i++)
{
// 先输出高位字节
*pDst++ = wchar >> 8;
// 后输出低位字节
*pDst++ = wchar &amp
0xff;
}
*pDst='/0';
// 返回目标编码串长度
return nDstLength * 2

}

int CSmsExampleDlg::gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
int nDstLength
// UNICODE宽字符数目
WCHAR wchar[128]
// UNICODE串缓冲区

// 高低字节对调,拼成UNICODE
for(int i=0
i<nSrcLength/2
i++)
{
// 先高位字节
wchar = *pSrc++ << 8;
// 后低位字节
wchar |= *pSrc++;
}
// UNICODE串-->字符串
nDstLength = ::WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL);
// 输出字符串加个结束符
pDst[nDstLength] = '/0'

// 返回目标字符串长度
return nDstLength;
}


自己试了一下,翻译过来不能用,不明白那里有问题,请懂C++ 和Delhpide的兄弟帮帮忙翻译一下
 
function gsmEncodeUcs2(const pSrc:PChar;var pDst:PByte;const nSrcLength:Integer):Integer;
var
nDstLength,i:Integer;// UNICODE宽字符数目
wchar:array[0..127] of WideChar;// UNICODE串缓冲区
begin
// 字符串-->UNICODE串
nDstLength :=MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128);
for i:=0 to nDstLength do
begin
pDst^ :=Byte(Word(wchar) shr 8);
Inc(pDst);
pDst^ :=Byte(Word(wchar) and $00ff);
Inc(pDst);
end;
pDst^ :=0;
Result:=nDstLength *2;
end;
function gsmDecodeUcs2(var pSrc:PByte;var pDst:PChar;const nSrcLength:Integer):Integer;
var
nDstLength,i:Integer;// UNICODE宽字符数目
wchar:array[0..127] of WideChar;// UNICODE串缓冲区
begin
for i:=0 to (nSrcLength div 2) do
begin
wchar :=WideChar(pSrc^);
wchar :=WideChar(Word(wchar) shl 8);
Inc(pSrc);
wchar :=WideChar(Word(wchar) or pSrc^);
Inc(pSrc);
end;
nDstLength :=WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength div 2, pDst, 160, nil,nil);
pDst[nDstLength] :=#0;
Result :=nDstLength;
end;
 
pDst^ :=Byte(Word(wchar) shr 8);

出错,pDst^ 里面是一个 wideChar , Byte(Word(wchar) shr 8) 是 Byte

就是这个问题,困难着我
 
function gsmEncodeUcs2(const pSrc:PChar;var pDst:PByte;const nSrcLength:Integer):Integer;

出入参 pDst 这么用,怎么用呢? 我要一个 PwideChar 或 PChar 啊
 
function gsmEncodeUcs2(pSrc, pDst: PChar
nSrcLength: Integer): Integer;
var
nDstLength, i: Integer
// UNICODE宽字符数目
wchar: array[0..127] of WideChar
// UNICODE串缓冲区
begin
// 字符串-->UNICODE串
nDstLength := MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128);

// 高低字节对调,输出
for i := 0 to nDstLength - 1 do
begin
// 先输出高位字节
pDst^ := Char(Word(wchar) shr 8);
Inc(pDst);
// 后输出低位字节
pDst^ := Char(Word(wchar) and $ff);
Inc(pDst);
end;
pDst^ := #0;
// 返回目标编码串长度
Result := nDstLength * 2;
end;

function gsmDecodeUcs2(pSrc, pDst: PChar
nSrcLength: Integer): Integer;
var
nDstLength, i: Integer
// UNICODE宽字符数目
wchar: array[0..127] of WideChar
// UNICODE串缓冲区
begin
// 高低字节对调,拼成UNICODE
for i := 0 to nSrcLength div 2 - 1 do
begin
// 先高位字节
wchar := WideChar(Byte(pSrc^) shr 8);
Inc(pSrc);
// 后低位字节
wchar := WideChar(Word(wchar) or Byte(pSrc^));
Inc(pSrc);
end;
// UNICODE串-->字符串
nDstLength := WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength div 2, pDst, 160, nil, nil);
// 输出字符串加个结束符
pDst[nDstLength] := #0;
// 返回目标字符串长度
Result := nDstLength;
end;
 
本质上说Byte,Char等同,Word,WideChar等同
function gsmEncodeUcs2(const pSrc: PChar
pDst: PChar
nSrcLength: Integer):
Integer;
var
nDstLength : Integer
// UNICODE宽字符数目
WChar : array[0..127] of WideChar
// UNICODE串缓冲区
I : Integer;
begin

// 字符串-->UNICODE串
//nDstLength = ::MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128);
nDstLength := MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128);
I := 0;
while I < nDstLength do
begin
pDst^ := Char(Word(Wchar[i div 2]) shr 8);
Inc(pDst);
pDst^ := Char(Word(Wchar[i div 2]) and $FF);
Inc(pDst);
end;

pDst^ := #0;
// 返回目标编码串长度
Result := nDstLength * 2;
end;


Function gsmDecodeUcs2(pSrc, pDst:PChar
nSrcLength:Integer):Integer;
var
nDstLength:Integer
// UNICODE宽字符数目
wchar:array[0..127] of WideChar
// UNICODE串缓冲区
I:Integer;
begin

// 高低字节对调,拼成UNICODE
I:=0;
While I< (nSrcLength div 2) do
begin
wchar:=WideChar(Byte(pSrc^) shl 8);
Inc(pSrc);
wchar := WideChar(Word(wchar) or Byte(pSrc^));
Inc(pSrc);
end;

// UNICODE串-->字符串
nDstLength :=WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength div 2, pDst, 160, nil,nil);

//nDstLength = ::WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL);
// 输出字符串加个结束符
pDst[nDstLength]:=#0;
// 返回目标字符串长度
Result := nDstLength;
end;
 
int CSmsExampleDlg::gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength)
从这里看来,pDst应该是pByte,如果用pChar的话,对一些大于127的点,可能会在运行时丢失标志位的信息(在C里面确实会丢失这样的信息,Delphi里想也不例外吧)
--------------------------------------------------------------------------
pDst^ :=Byte(Word(wchar) shr 8);

出错,pDst^ 里面是一个 wideChar , Byte(Word(wchar) shr 8) 是 Byte

就是这个问题,困难着我

我这里编译是没有问题,不知楼主那里出的什么错误?
 
出入参 pDst 这么用,怎么用呢? 我要一个 PwideChar 或 PChar 啊

在传这个入口参数的时候,强制性的转换一下类型,把PChar强制性的转换为PByte
这么作才能使楼主得到正确的结果吧,而直接用pChar的话,会丢信息
 
学习,unicode 怎么转换
 
后退
顶部