zoukankan      html  css  js  c++  java
  • 关于C中数组的组织存放

    开始转向到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中取这个长度的内容。

    写了这么多,不为别的,本人只是个新手,为了以后做点小功课,有什么不恰当的地方,请大家多多指点。

  • 相关阅读:
    JSP指令简介(转)
    test markdown
    10个值得前端收藏的CSS3动效库(工具)
    停止不必要的UI动效设计
    UI新手学配色
    改网页鼠标指针、改指定元素指针(2)——小白也能自绘指针
    CSS改网页鼠标指针、改指定元素指针(1)——代码部分
    更高的效率、管理你的文件:Listary!!
    对js操作html的实践【2】——随机标题与滚动标题
    对js操作html的实践【1】——实现网页假崩溃吸引网友注意力
  • 原文地址:https://www.cnblogs.com/lyanet/p/2868367.html
Copyright © 2011-2022 走看看