代碼報(bào)了個(gè)錯(cuò):“byte array size is smaller than the size of the structur”,意思就是byte數(shù)組的大小小于結(jié)構(gòu)體的大小,這個(gè)錯(cuò)報(bào)出來的原因是我代碼中有個(gè)邏輯,需要將byte數(shù)組轉(zhuǎn)換成結(jié)構(gòu)體,但很顯然,我沒有轉(zhuǎn)換成功,這是咋回事呢?
這個(gè)錯(cuò)報(bào)得我莫名其妙的,找了一個(gè)小時(shí)左右都沒找到問題出在哪,但是最后發(fā)現(xiàn)問題的時(shí)候,我甚至有些無語。在說清楚問題到底出在哪之前,我們得先了解下代碼的業(yè)務(wù)邏輯,然后您就知道為什么開始我覺得莫名其妙了!
代碼的業(yè)務(wù)邏輯是這樣的,我們的業(yè)務(wù)中有一個(gè)服務(wù)端和很多個(gè)客戶端,客戶端會(huì)定期給服務(wù)端發(fā)送消息,消息是以結(jié)構(gòu)體的形式發(fā)送的,當(dāng)然,在發(fā)送消息的時(shí)候,需要將結(jié)構(gòu)體轉(zhuǎn)換成byte數(shù)組。
為了確保發(fā)送消息的一致性,我特地封裝了一個(gè)專門用來處理消息的函數(shù)庫,這樣就能確保每個(gè)客戶端在發(fā)送和接收消息的時(shí)候不會(huì)出現(xiàn)任何差錯(cuò)。
但是,差錯(cuò)偏偏就出現(xiàn)了!在某個(gè)客戶端上就出現(xiàn)了文章開頭的那個(gè)錯(cuò)!
經(jīng)過調(diào)試,我發(fā)現(xiàn)所有客戶端發(fā)送的消息內(nèi)容都是一樣的,并沒有任何區(qū)別。
結(jié)構(gòu)體屬于基本數(shù)據(jù)類型,因此在定義的時(shí)候,長度就已經(jīng)確定了,我在服務(wù)端進(jìn)行調(diào)試,發(fā)現(xiàn)結(jié)構(gòu)體的長度為288,但是,服務(wù)端接收到的byte數(shù)組長度卻只有280,如此一來,在將byte轉(zhuǎn)換成結(jié)構(gòu)體的時(shí)候,因?yàn)殚L度不一致,導(dǎo)致了轉(zhuǎn)換失敗。
前面說了,我專門封裝了一個(gè)消息處理的庫,服務(wù)端和客戶端使用的是庫里面同一個(gè)結(jié)構(gòu)體,不可能會(huì)出現(xiàn)兩邊長度不一致的情況。
事出反常必有妖!
服務(wù)端是同一個(gè)服務(wù)端,因此問題只可能出現(xiàn)在客戶端的代碼上!因?yàn)槲覀兊目蛻舳擞胁煌姹?,每個(gè)版本有單獨(dú)的代碼,而代碼只有略微差別。
我拿了不同版本的客戶端代碼進(jìn)行調(diào)試,詭異的是,出問題的那個(gè)客戶端在發(fā)送消息時(shí),結(jié)構(gòu)體的長度偏偏就是280,而其他客戶端在發(fā)送消息時(shí),結(jié)構(gòu)體長度卻是288!
一個(gè)小時(shí)都過去了,我硬是沒找出問題所在,于是,我只能使用笨辦法,那就是作對(duì)比,看看出問題的客戶端代碼和沒出問題的客戶端代碼有什么不同。
這么一對(duì)比,就讓我找到了差異點(diǎn),原來,出問題的客戶端代碼在編譯的時(shí)候勾選了“首選32位”,我一拍腦袋:“原來是這樣!”
這個(gè)結(jié)構(gòu)體的內(nèi)容很簡單,里面是由一個(gè)Int64字段+兩個(gè)Int32字段+一個(gè)指針+一個(gè)指定了長度的字符串字段組成,其中,字符串的長度被指定為255。
公司代碼是用C#編寫的,在C#中,正常情況下,Int64所占字節(jié)數(shù)為8位,Int32所占字節(jié)數(shù)為4位,指針?biāo)甲止?jié)數(shù)為8位。
而指針類型在32位環(huán)境和64位環(huán)境里面所占用的字節(jié)是不一樣的,在32位環(huán)境里占4個(gè)字節(jié),而在64位環(huán)境里則占8個(gè)字節(jié)!
結(jié)語
因此,最終真相大白!于是我去除勾選“首選32位”,再次編譯,發(fā)現(xiàn)結(jié)構(gòu)體的長度變成了288!
說到這里,肯定有人關(guān)心為什么項(xiàng)目被勾選了“首選32位”,因?yàn)槲乙恢睕]有將代碼上傳代碼庫,所以具體是怎么發(fā)生的,其實(shí)我也不知道,也許是IDE默認(rèn)就給勾上了,但是因?yàn)橐恢睕]測到這,所以問題一直沒被發(fā)現(xiàn)。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.