作者petercoin (彼得币)
看板C_and_CPP
标题[问题] 传入函式的buffer长度判断问题
时间Tue Mar 22 10:09:13 2016
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
None
问题(Question):
现在正在开发一个函式,
目的是要提供一个介面让使用者传送资料,
介面定义如下:
SendVendorCmd(short cmd, char *data, int dataLength)
我目前知道的是如果进来的资料是用malloc配置记忆体的话,
可以用_msize来查看大小,
如果是null-terminated的字串的话,
可以用strlen来查看大小,
但是不确定使用者会用哪种配置方式,
而且这笔资料也不一定会是null-terminated,
所以我加了一个dataLength的参数。
又考虑到假如使用者丢的dataLength大小超过实际上data的长度,
可能会产生问题,
所以想请教有办法判断使用者传进来的data真正的长度吗?
还是有其他更适合的参数宣告吗?
喂入的资料(Input):
None
预期的正确结果(Expected Output):
None
错误结果(Wrong Output):
None
程式码(Code):(请善用置底文网页, 记得排版)
补充说明(Supplement):
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 113.196.154.130
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1458612555.A.02D.html
1F:→ Caesar08: dataLength超过实际大小是使用者的问题吧,应该不用管 03/22 10:21
所以我应该本着使用者不会耍蠢的想法来做吗哈哈
2F:推 Clangpp: char *可以改用string就好了?? 这就不用担心了?? 03/22 12:09
3F:推 Clangpp: 不然就是用vector<char> 03/22 12:17
主要是因为丢进来的东西不一定真的是字串
也有可能是一整串硬体控制的指令
所以就没有考虑string了
vector<char>的部分我再研究看看
谢谢你的意见!!
4F:→ Caesar08: 我猜他可能只能用C 03/22 12:32
就只有介面的参数部分我是希望用不是C++的型别啦
所以只能舍弃掉很多好用的东西
5F:推 CaptainH: 应该只能这样 03/22 14:08
6F:推 noodleT: 你的data 会不会有0x00的资料?有的话就只能用datalength 03/23 07:11
基本上会有
不过我蛮好奇如果没有0x00的资料的话
有什麽其他的判断方法吗?
7F:推 Clangpp: 有0x00的话喔 你还是用vector<byte>吧 为什麽一定要用cha 03/23 09:55
8F:→ Clangpp: r呢?? 03/23 09:55
9F:→ Clangpp: 然後建议你可以去看 effecitve STL有教你如何用vector跟 03/23 09:57
10F:→ Clangpp: C的API来接 03/23 09:57
非常谢谢你的建议!!
至於为啥一定要用char...
因为送到硬体的资料我是用WriteFile
又是临时学C++的
所以不知不觉还是用C的写法在写这些东西
不过现阶段也不知道该怎麽做会比较好
我实际上是在开发JNI跟硬体之间沟通的API
JNI丢下来的资料型态是jstring
不过刚刚查了一下jstring也可以转std::string
std::string也可以转成char*让我可以丢进去WriteFile
这样看来用string是一个好主意
我再来研究一下如果要改成string该怎麽设计
也非常谢谢大家给的建议!!
11F:推 Clangpp: 我看了一下 WriteFile的API没有必要用char吧?? 03/23 22:02
实际上他是LPVOID的型别
不过因为我们用的硬体的关系
所以习惯都用char的阵列丢指令
12F:推 EdisonX: 硬体收发资料实际上是用 unsigned char 较佳。 03/24 10:01
想请教一下使用char会有什麽疑虑吗?
因为在Java的部分是没有unsigned的
如果会有问题我可能要想办法来测试一下...
13F:推 firejox: 要不然你就自己封装一个资料结构 让使用者用这个来传 03/24 23:06
例如使用struct然後在里面放入必要的变数吗?
14F:推 noodleT: 有一些标准函式也会要求使用者输入资料长度,或像 printf 03/26 23:09
15F:→ noodleT: 他也是信赖你输入的引数够给 format 使用。看你是想采取 03/26 23:09
16F:→ noodleT: 怎样的设计 03/26 23:09
17F:推 noodleT: 你的 data 有固定格式吗?例如结尾固定是两个0x00,0x00? 03/26 23:15
18F:→ noodleT: 这样的话就可以自己去扫阵列获得长度。 03/26 23:15
19F:→ noodleT: 题外话,你的引数 char *data 建议改成 const char *data 03/26 23:15
目前data没有固定格式耶
不过应该也是能规定使用者最後要加上去?
引数的部分我会再更改一下的
谢谢你的建议~
20F:推 Clangpp: 加const 是为了保护你传进来的资料不会被变动 03/27 22:17
21F:推 noodleT: const 也是让使用者能够信赖你不会去改我的值 03/27 23:22
谢谢两位的建议
小弟我对这部分的着墨实在是不够
还好有大家的帮助才能把这个东西做得更好!!
※ 编辑: petercoin (220.130.36.2), 03/28/2016 08:26:14