DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: wugangbest
今日帖子: 26
在线用户: 18
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
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不知道如何才能正确的读取?
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
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;
        }
    }
}
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2017/2/19 0:49:08
2楼: 直接翻就可以了,就这么几句代码而已。

你要注意一下,c的char对应delphi的ansichar。
低版本的用char无所谓,高版本的一定要ansichar。

还有,你要注意c代码里有没有指定字节对齐。有的话你对应这边也要指定。
----------------------------------------------
--
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
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
==========”
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 testerhook (CaptainHook) ★☆☆☆☆ -
普通会员
2017/2/19 12:03:19
4楼: 断点调试一下,看看取得的数组里面是什么不就行了。
还有,别人说的东西,楼主根本就不理,只管自己,在这样,就没人会帮你了
----------------------------------------------
-
作者:
男 xuchuantao (暗黑天使) ★☆☆☆☆ -
普通会员
2017/2/19 12:23:24
5楼: TBL_StepInfo = record
    step:Integer;
    desc:array [0..STEP_DESC_SIZE-1] of ansiChar;
    totalStep:Integer;
  end;
试试
----------------------------------------------
按此在新窗口浏览图片
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2017/2/19 12:25:00
5楼: testerhook说的对,我是没明白指定字节对齐是什么意思,不知道c里面关于这个的语句是怎么样的,还有我用的是D7应该是低版本的

testerhook,断点的数组里的内容
此帖子包含附件:
PNG 图像
大小:42.7K
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2017/2/19 15:42:07
6楼: 看来兰州不怎么懂c语言。
c语言里,指针和数组是可以混用的。
你居然用指针数组去接人家的指针类型返回值?
----------------------------------------------
--
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2017/2/19 16:35:01
7楼: 所以bahamut8348 ,这个乱码“杩涘叆recovery”应该怎么搞?
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2017/2/19 17:28:53
8楼: 你调用代码写错了而已。
你要用指针去接收返回值。
如果要遍历的话,也只能用指针去控制,可以用inc(...)来步进,类似:

p := pret; // 指向入口
for i := 0 to count - 1 do // 注意这里要减一。。。
begin
  showmessage(p^.desc);
  inc(p);
end;
----------------------------------------------
--
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
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

@铪铪铪铪铪铪铪铪铪铪
铪铪铪铪铪铪铪铪铪铪
铪铪铪铪铪铪铪铪铪铪
…………………………
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2017/2/20 9:57:12
10楼: 断点得到的XBL_StepInfo^.desc数据是这样的,像类似这种如何转码
转到string时,是类似“杩涘叆recovery”的,我在网上直接搜索“杩涘叆”,看到很多页面里的内容也有这些个乱码,这两者是有关系的把?
此帖子包含附件:
JPEG 图像
大小:174.4K
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
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
----------------------------------------------
-
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2017/2/20 10:08:23
11楼: wk_knife 这个是之前测试的,已经确定是错误的了,上面的回复里leonna说c语言里,指针和数组是可以混用的,所以delphi不能照着使用。所以那个应该不是指针数组类型。我觉得应该是把十楼那张图片里的东西转码成功,就完成了
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2017/2/20 10:37:02
12楼: 找到原因了,用Utf8ToAnsi即可
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/2/20 11:28:17
13楼: 说明 DLL 作者是白痴,居然用 Char * 传 utf8 ,也不说一声。
难道,大家是这个 DLL 作者肚子里的蛔虫?

当然,也许人家文档说了,你瞎,没看见。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2017/2/20 15:54:44
14楼: 文档里真的没有说明,Flying Wang,utf8 正确的方法应该是什么,也好教我去数落一下那个作者
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/2/20 16:31:12
15楼: 没有正确的。
UTF8 和 ANSI 都是 Byte 为单位的。
如果写 Byte * 其实也一样。
Byte * 或 Char * 一般默认Ansi 。

如果希望传 UTF8 必须写文档。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2017/2/21 0:48:25
16楼: sdk不是有demo么。。。
兰州居然不去搞个环境调试一下么??

哪需要去搜。。。

qDebug() << i << stepInfos[i].step << stepInfos[i].desc << stepInfos[i].totalStep;

人家这里的代码,肯定有转码操作的。一个断点就出来了。。。
----------------------------------------------
--
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2017/2/21 20:18:26
17楼: 第一我对C一定都不懂,之前还以为qDebug() << i << stepInfos[i].step << stepInfos[i].desc << stepInfos[i].totalStep;这个里面的stepInfos是个数组,所以更不要说你断点了
第二我能说这个sdk没有demo吗,后面好不容易才提供一个调试用的,也就几个函数,客户提供的东西,他们不愿写作业程序,说明文档就几页,好多都需要自己猜参数是什么意思。
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/2/22 8:43:06
18楼: sdk 是必然有开发者的,不可能变出来的。
----------------------------------------------
(C)(P)Flying Wang
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行101.5625毫秒 RSS