[問題] 傳入函式的buffer長度判斷問題

看板C_and_CPP作者 (彼得幣)時間9年前發表 (2016/03/22 02:09), 9年前編輯推噓12(1209)
留言21則, 6人參與, 最新討論串1/1
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1458612555.A.02D.html

03/22 10:21, , 1F
dataLength超過實際大小是使用者的問題吧,應該不用管
03/22 10:21, 1F
所以我應該本著使用者不會耍蠢的想法來做嗎哈哈

03/22 12:09, , 2F
char *可以改用string就好了?? 這就不用擔心了??
03/22 12:09, 2F

03/22 12:17, , 3F
不然就是用vector<char>
03/22 12:17, 3F
主要是因為丟進來的東西不一定真的是字串 也有可能是一整串硬體控制的指令 所以就沒有考慮string了 vector<char>的部分我再研究看看 謝謝你的意見!!

03/22 12:32, , 4F
我猜他可能只能用C
03/22 12:32, 4F
就只有介面的參數部分我是希望用不是C++的型別啦 所以只能捨棄掉很多好用的東西

03/22 14:08, , 5F
應該只能這樣
03/22 14:08, 5F

03/23 07:11, , 6F
你的data 會不會有0x00的資料?有的話就只能用datalength
03/23 07:11, 6F
基本上會有 不過我蠻好奇如果沒有0x00的資料的話 有什麼其他的判斷方法嗎?

03/23 09:55, , 7F
有0x00的話喔 你還是用vector<byte>吧 為什麼一定要用cha
03/23 09:55, 7F

03/23 09:55, , 8F
r呢??
03/23 09:55, 8F

03/23 09:57, , 9F
然後建議你可以去看 effecitve STL有教你如何用vector跟
03/23 09:57, 9F

03/23 09:57, , 10F
C的API來接
03/23 09:57, 10F
非常謝謝你的建議!! 至於為啥一定要用char... 因為送到硬體的資料我是用WriteFile 又是臨時學C++的 所以不知不覺還是用C的寫法在寫這些東西 不過現階段也不知道該怎麼做會比較好 我實際上是在開發JNI跟硬體之間溝通的API JNI丟下來的資料型態是jstring 不過剛剛查了一下jstring也可以轉std::string std::string也可以轉成char*讓我可以丟進去WriteFile 這樣看來用string是一個好主意 我再來研究一下如果要改成string該怎麼設計 也非常謝謝大家給的建議!!

03/23 22:02, , 11F
我看了一下 WriteFile的API沒有必要用char吧??
03/23 22:02, 11F
實際上他是LPVOID的型別 不過因為我們用的硬體的關係 所以習慣都用char的陣列丟指令

03/24 10:01, , 12F
硬體收發資料實際上是用 unsigned char 較佳。
03/24 10:01, 12F
想請教一下使用char會有什麼疑慮嗎? 因為在Java的部分是沒有unsigned的 如果會有問題我可能要想辦法來測試一下...

03/24 23:06, , 13F
要不然你就自己封裝一個資料結構 讓使用者用這個來傳
03/24 23:06, 13F
例如使用struct然後在裡面放入必要的變數嗎?

03/26 23:09, , 14F
有一些標準函式也會要求使用者輸入資料長度,或像 printf
03/26 23:09, 14F

03/26 23:09, , 15F
他也是信賴你輸入的引數夠給 format 使用。看你是想採取
03/26 23:09, 15F

03/26 23:09, , 16F
怎樣的設計
03/26 23:09, 16F

03/26 23:15, , 17F
你的 data 有固定格式嗎?例如結尾固定是兩個0x00,0x00?
03/26 23:15, 17F

03/26 23:15, , 18F
這樣的話就可以自己去掃陣列獲得長度。
03/26 23:15, 18F

03/26 23:15, , 19F
題外話,你的引數 char *data 建議改成 const char *data
03/26 23:15, 19F
目前data沒有固定格式耶 不過應該也是能規定使用者最後要加上去? 引數的部分我會再更改一下的 謝謝你的建議~

03/27 22:17, , 20F
加const 是為了保護你傳進來的資料不會被變動
03/27 22:17, 20F

03/27 23:22, , 21F
const 也是讓使用者能夠信賴你不會去改我的值
03/27 23:22, 21F
謝謝兩位的建議 小弟我對這部分的著墨實在是不夠 還好有大家的幫助才能把這個東西做得更好!! ※ 編輯: petercoin (220.130.36.2), 03/28/2016 08:26:14
文章代碼(AID): #1MyAbB0j (C_and_CPP)