關於C中數組的組織存放

來源:互聯網
上載者:User

開始轉向到IOS開發後,也慢慢覺得自己以前在大學學的東西很重要了。那些基礎東西都沒學進去,現在感覺到吃力了。不過青春還在,可以亡羊補牢。

在OC裡面或多或少會用到C或自己寫一點C程式。在最近的一個項目底層架構都是同事搭建好的,很多也用到了C。項目接近尾聲,我也開始有點時間來看看這些底層的代碼了。首先看了sokect編程,然後在這裡寫到了一個函數。

View Code

 1 - (void) sendRequestToRelayServer 2 { 3     UInt8 buf[512] = {0}; 4     int nOffset = 4; 5     int nSrcLen = [source length]; 6     buf[nOffset] = (UInt8)nSrcLen; 7     nOffset++; 8     memcpy(buf + nOffset, [source UTF8String], nSrcLen); 9     nOffset += nSrcLen;10     int nDstLen = [destination length];11     buf[nOffset] = (UInt8)nDstLen;12     nOffset++;13     memcpy(buf + nOffset, [destination UTF8String], nDstLen);14     int nTotalLen = nSrcLen + nDstLen + 2;15     buf[0] = RSPacket_Request; //請求包類型16     buf[1] = nTotalLen >> 16;17     buf[2] = nTotalLen >> 8;18     buf[3] = nTotalLen;19     20     [self sendData:buf packetSize:nTotalLen + 4];21     NSLog(@"向代理服務器發送請求src=[%@]dest=[%@]", source, destination);22 }

由於我是C#程式員出身,所以很少接觸到C,也沒寫過C。所以在這裡,對這些C的組織和一些方法及意義不太熟悉。這段代碼看過以後,本來還有很多不太熟悉不太明白的地方。後來請教了同事。
這段代碼作用是發送請求到代理服務器去,具體說是一個請求串連,組織帶上了請求資訊放進Buf。UInt8 buf[512] = {0};這句其實就是開闢一個類型為UInt8的數組,其實UInt8就是UChar型,數組的空間為512.並初始化0。int nSrcLen = [source length];將請求源資訊的長度用nSrcLen儲存.把他的長度資訊放進buf[nOffset]裡,假如nSrcLen=14,那麼在buf[4]儲存的資訊就是14(二進位表示00001110,所以buf[4]存放的內容就是00001110),那怎麼存放的呢?開始我不明白,其實只是自己接觸的太少或沒去研究這些,因為對於C#程式員來說,更不需要懂這些。buf是UInt8類型的,那麼就只有一個位元組,也就是2的八次方,八位。那麼buf[4]可以存0-255之間的ASCII碼值。而nSrcLen=14。所以buf[4]=14.memcpy(buf + nOffset, [source UTF8String], nSrcLen);這句代碼將source的源本資訊存放到buf裡面,從buf[5]開始,存放長度為nSrcLen,如果source = @“Mobile_BX_1234”那麼buf[5]='M',但M的ASCII碼值為077,所以buf[5]存放的077,二進位表示也就是01001101,obile_BX_123中的字母就以此類推了。這時nOffSet += nSrcLen;destination 表示目標。用nDstLen來存放他的長度。 buf[nOffset] = (UInt8)nDstLen;這時nOffSet=19,也就是bu[19]裡面存放destination的長度。nOffset++;memcpy(buf + nOffset, [destination UTF8String], nDstLen);這句跟前面的memcpy(buf + nOffset, [source UTF8String], nSrcLen);一樣。這時buf實際長度為nTotalLen = nSrcLen + nDstLen +2; 一開始時nOffSet = 4,就預留了4個空間來表示要發送的資料的長度,假設destination的長度也等於14,則nTotalLen = 14+14+2=30;用二進位表示00000000 00000000 00000000 00011110,buf[0] 存放的是請求包類型,假設等於1  這用二進位表示為00000001;,buf[1]是將nTotalLen右移了16位,即00000000 00000000而他本身只能存放8位,所以只能存放最右邊的八位也就是00000000,buf[2]是將bTotalLen右移動了8位,即00000000 00000000 00000000,同理也只能存放8位,即最右邊的00000000,buf[3]中沒有移動nTotalLen,直接存放,則會忽略前面的24位,直接存放了右邊的8位,即00011110.這樣,要發送的內容的長度在buf的前四個位元組中就表示好了。發送到伺服器後,那邊同樣的方法解析出他的長度,再從buf中取這個長度的內容。

寫了這麼多,不為別的,本人只是個新手,為了以後做點小功課,有什麼不恰當的地方,請大家多多指點。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.