关于C中数组的组织存放
开始转向到IOS开发后,也慢慢觉得自己以前在大学学的东西很重要了。那些基础东西都没学进去,现在感觉到吃力了。不过青春还在,可以亡羊补牢。
在OC里面或多或少会用到C或自己写一点C程序。在最近的一个项目底层框架都是同事搭建好的,很多也用到了C。项目接近尾声,我也开始有点时间来看看这些底层的代码了。首先看了sokect编程,然后在这里写到了一个函数。
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中取这个长度的内容。
写了这么多,不为别的,本人只是个新手,为了以后做点小功课,有什么不恰当的地方,请大家多多指点。