导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2017/2/18 16:44:35
标题:
char数组内有乱码,要如何操作啊
浏览:1890
加入我的收藏
楼主:
一个C的DLL,头文件里是这样的 typedef struct BL_StepInfo { int step; char desc[STEP_DESC_SIZE]; int totalStep; }BL_StepInfo; typedef struct FactorySDKDll BL_FactorySDKDll; __declspec(dllexport) BL_StepInfo* BL_getTotalSteps(BL_FactorySDKDll* inst); 我转化成delphi的声明,是这样的 const BLSDK ='FactorySDKDll.dll'; STEP_DESC_SIZE=100; type TBL_FactorySDKDll = record end; PBL_FactorySDKDll = ^TBL_FactorySDKDll; TBL_StepInfo = record step:Integer; desc:array [0..STEP_DESC_SIZE-1] of Char; totalStep:Integer; end; PBL_StepInfo = ^TBL_StepInfo; function BL_getTotalSteps(inst:PBL_FactorySDKDll):PBL_StepInfo; cdecl; external BLSDK; //========== 调用BL_getTotalSteps获取结构体返回值内的desc不知道如何才能正确的读取?
----------------------------------------------
只会简单使用,并未精通深入
作者:
2017/2/18 19:42:18
1楼:
C的调用是这样的 void MainWindow::initFunction() { QLibrary lib("FactorySDKDll.dll"); if (!lib.load()) { qDebug() << "load dll fail"; } createFunc = (CreateDLLFunc)lib.resolve("BL_createInstance"); deleteFunc = (DeleteDllFunc)lib.resolve("BL_releaseInstance"); setPackFunc = (SetPackageFunc)lib.resolve("BL_setPackage"); setLicenseFunc = (SetDidLicenseFunc)lib.resolve("BL_setDidLicense"); totalStepFunc = (GetTotalStepFunc)lib.resolve("BL_getTotalSteps"); registerCBFunc = (RegisterCBFunc)lib.resolve("BL_registerCallback"); executeFunc = (ExecuteStepFunc)lib.resolve("BL_executeStep"); openFunc = (OpenPortFunc)lib.resolve("BL_openSerialPort"); closeFunc = (ClosePortFunc)lib.resolve("BL_closeSerialPort"); } void MainWindow::on_btnGetSteps_clicked() { if (totalStepFunc && dll) { stepInfos = totalStepFunc(dll); if (stepInfos) { totalStep_ = stepInfos[0].totalStep; } for (int i = 0; i < totalStep_; ++i) { qDebug() << i << stepInfos[i].step << stepInfos[i].desc << stepInfos[i].totalStep; } } }
----------------------------------------------
只会简单使用,并未精通深入
作者:
2017/2/19 0:49:08
2楼:
直接翻就可以了,就这么几句代码而已。 你要注意一下,c的char对应delphi的ansichar。 低版本的用char无所谓,高版本的一定要ansichar。 还有,你要注意c代码里有没有指定字节对齐。有的话你对应这边也要指定。
----------------------------------------------
--
作者:
2017/2/19 10:25:04
3楼:
前面C的调用里stepInfos是个数组的概念吗? ========== 之前我是这样调用的,但是里面有乱码 var XBL_StepInfo:PBL_StepInfo; XBL_StepInfo:=BL_getTotalSteps(pRet) ; // Memo1.Lines.Add(XBL_StepInfo^.desc); Memo1.Lines.Add(StrPas(@XBL_StepInfo.desc[0])); 得到的是“杩涘叆recovery” ========== 如果将它认为返回值是个数组,仿照C的 var BL_StepInfo:array [0..16] of PBL_StepInfo; BL_StepInfo[0]:=BL_getTotalSteps(pRet) ; //BL_StepInfo:step,totalStep,desc j:=BL_StepInfo[0].totalStep; for i:=0 to j do begin Memo1.Lines.Add(IntToStr(BL_StepInfo[i].step)); Memo1.Lines.Add(BL_StepInfo[i]^.desc); // Memo1.Lines.Add(StrPas(@BL_StepInfo[i].desc[0])); Memo1.Lines.Add(IntToStr(BL_StepInfo[i].totalStep)); Memo1.Lines.Add('=========='); end 返回的是下面的,更看不明白了 “ 0 杩涘叆recovery 5 ========== 0 0 ========== 4363792 Q7_7 1636096 ========== 17156000 0 ========== 1636060 臱Tw#; 0 ========== -1957298293 靸?S媇V媠35?]wW?艵 76351885 ==========”
----------------------------------------------
只会简单使用,并未精通深入
作者:
2017/2/19 12:03:19
4楼:
断点调试一下,看看取得的数组里面是什么不就行了。 还有,别人说的东西,楼主根本就不理,只管自己,在这样,就没人会帮你了
----------------------------------------------
-
作者:
2017/2/19 12:23:24
5楼:
TBL_StepInfo = record step:Integer; desc:array [0..STEP_DESC_SIZE-1] of ansiChar; totalStep:Integer; end; 试试
----------------------------------------------
作者:
2017/2/19 12:25:00
5楼:
testerhook说的对,我是没明白指定字节对齐是什么意思,不知道c里面关于这个的语句是怎么样的,还有我用的是D7应该是低版本的 testerhook,断点的数组里的内容
此帖子包含附件: 大小: 42.7K
----------------------------------------------
只会简单使用,并未精通深入
作者:
2017/2/19 15:42:07
6楼:
看来兰州不怎么懂c语言。 c语言里,指针和数组是可以混用的。 你居然用指针数组去接人家的指针类型返回值?
----------------------------------------------
--
作者:
2017/2/19 16:35:01
7楼:
所以bahamut8348 ,这个乱码“杩涘叆recovery”应该怎么搞?
----------------------------------------------
只会简单使用,并未精通深入
作者:
2017/2/19 17:28:53
8楼:
你调用代码写错了而已。 你要用指针去接收返回值。 如果要遍历的话,也只能用指针去控制,可以用inc(...)来步进,类似: p := pret; // 指向入口 for i := 0 to count - 1 do // 注意这里要减一。。。 begin showmessage(p^.desc); inc(p); end;
----------------------------------------------
--
作者:
2017/2/19 19:38:39
9楼:
谢谢bahamut8348, 然后我按照你的代码运行了, XBL_StepInfo:=BL_getTotalSteps(pRet) ; for i := 0 to 20 do // 注意这里要减一。。。 begin Memo1.Lines.Add(XBL_StepInfo^.desc); inc(XBL_StepInfo); end; exit; 以下返回的是这样的, //========== 杩涘叆recovery 鐑у綍mac 妫娴媘ac涓鑷存? 鍗囩骇udp鍥轰欢 鍐嶆鎵爜 铪铪 铪铪铪铪铪铪铪铪铪铪9D|R$0 @铪铪铪铪铪铪铪铪铪铪 铪铪铪铪铪铪铪铪铪铪 铪铪铪铪铪铪铪铪铪铪 …………………………
----------------------------------------------
只会简单使用,并未精通深入
作者:
2017/2/20 9:57:12
10楼:
断点得到的XBL_StepInfo^.desc数据是这样的,像类似这种如何转码 转到string时,是类似“杩涘叆recovery”的,我在网上直接搜索“杩涘叆”,看到很多页面里的内容也有这些个乱码,这两者是有关系的把?
此帖子包含附件: 大小: 174.4K
----------------------------------------------
只会简单使用,并未精通深入
作者:
2017/2/20 10:02:27
10楼:
var BL_StepInfo:array [0..16] of PBL_StepInfo; //感觉这个声明应该有问题 BL_StepInfo[0]:=BL_getTotalSteps(pRet) ; //BL_StepInfo:step,totalStep,desc 应该 BL_StepInfo_Array = array of BL_StepInfo PBL_StepInfo_Array =^BL_StepInfo_Array ; BL_StepInfo: PBL_StepInfo_Array ; BL_StepInfo = BL_getTotalSteps(pRet) ; for i :=low(BL_StepInfo^) to high(BL_StepInfo^) do
----------------------------------------------
-
作者:
2017/2/20 10:08:23
11楼:
wk_knife 这个是之前测试的,已经确定是错误的了,上面的回复里leonna说c语言里,指针和数组是可以混用的,所以delphi不能照着使用。所以那个应该不是指针数组类型。我觉得应该是把十楼那张图片里的东西转码成功,就完成了
----------------------------------------------
只会简单使用,并未精通深入
作者:
2017/2/20 10:37:02
12楼:
找到原因了,用Utf8ToAnsi即可
----------------------------------------------
只会简单使用,并未精通深入
作者:
2017/2/20 11:28:17
13楼:
说明 DLL 作者是白痴,居然用 Char * 传 utf8 ,也不说一声。 难道,大家是这个 DLL 作者肚子里的蛔虫? 当然,也许人家文档说了,你瞎,没看见。
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/2/20 15:54:44
14楼:
文档里真的没有说明,Flying Wang,utf8 正确的方法应该是什么,也好教我去数落一下那个作者
----------------------------------------------
只会简单使用,并未精通深入
作者:
2017/2/20 16:31:12
15楼:
没有正确的。 UTF8 和 ANSI 都是 Byte 为单位的。 如果写 Byte * 其实也一样。 Byte * 或 Char * 一般默认Ansi 。 如果希望传 UTF8 必须写文档。
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/2/21 0:48:25
16楼:
sdk不是有demo么。。。 兰州居然不去搞个环境调试一下么?? 哪需要去搜。。。 qDebug() << i << stepInfos[i].step << stepInfos[i].desc << stepInfos[i].totalStep; 人家这里的代码,肯定有转码操作的。一个断点就出来了。。。
----------------------------------------------
--
作者:
2017/2/21 20:18:26
17楼:
第一我对C一定都不懂,之前还以为qDebug() << i << stepInfos[i].step << stepInfos[i].desc << stepInfos[i].totalStep;这个里面的stepInfos是个数组,所以更不要说你断点了 第二我能说这个sdk没有demo吗,后面好不容易才提供一个调试用的,也就几个函数,客户提供的东西,他们不愿写作业程序,说明文档就几页,好多都需要自己猜参数是什么意思。
----------------------------------------------
只会简单使用,并未精通深入
作者:
2017/2/22 8:43:06
18楼:
sdk 是必然有开发者的,不可能变出来的。
----------------------------------------------
(C)(P)Flying Wang