最近用到了socket, 在发送数据的时候遇到了问题 所以拿出来分享下。
由于服务器需要 8位数 byte数组 所以方法是这样
- (void)sendMessageForservers:(NSString *)message {
NSString *hexString = message; //16进制字符串
int j=0;
Byte bytes[8];
for(int i=0;i<[hexString length];i++)
{
int int_ch; /// 两位16进制数转化后的10进制数
unichar hex_char1 = [hexString characterAtIndex:i]; ////两位16进制数中的第一位(高位*16)
int int_ch1;
if(hex_char1 >= '0' && hex_char1 <='9')
int_ch1 = (hex_char1-48)*16; //// 0 的Ascll - 48
else if(hex_char1 >= 'A' && hex_char1 <='F')
int_ch1 = (hex_char1-55)*16; //// A 的Ascll - 65
else
int_ch1 = (hex_char1-87)*16; //// a 的Ascll - 97
i++;
unichar hex_char2 = [hexString characterAtIndex:i]; ///两位16进制数中的第二位(低位)
int int_ch2;
if(hex_char2 >= '0' && hex_char2 <='9')
int_ch2 = (hex_char2-48); //// 0 的Ascll - 48
else if(hex_char2= 'A' && hex_char2 <='F')
int_ch2 = hex_char2-55; //// A 的Ascll - 65
else
int_ch2 = hex_char2-87; //// a 的Ascll - 97
int_ch = int_ch1+int_ch2;
NSLog(@"int_ch=%d",int_ch);
bytes[j] = int_ch; ///将转化后的数放入Byte数组里
j++;
}
NSData *newData = [[NSData alloc] initWithBytes:bytes length:8];
[sendTcpSocket writeData:newData withTimeout:-1 tag:0];
}
在我做demo的时候 这样的方法 并没有出问题 但是在项目的时候 由于多线程 导致i老是越界 上了锁也没有用 但是单调就是好的 所以也不知道哪出的问题 于是就改成下面了
- (void)sendMessageForservers:(NSString *)message {
Lock();
NSString *hexString = message; //16进制字符串
int j=0;
Byte bytes[8];
for(int i=0;i<[hexString length]/2;i++)
{
int int_ch; /// 两位16进制数转化后的10进制数
unichar hex_char1 = [hexString characterAtIndex:i*2];
int int_ch1;
if(hex_char1 >= '0' && hex_char1 <='9')
int_ch1 = (hex_char1-48)*16; //// 0 的Ascll - 48
else if(hex_char1 >= 'A' && hex_char1 <='F')
int_ch1 = (hex_char1-55)*16; //// A 的Ascll - 65
else
int_ch1 = (hex_char1-87)*16; //// a 的Ascll - 97
unichar hex_char2 = [hexString characterAtIndex:i*2 + 1];
int int_ch2;
if(hex_char2 >= '0' && hex_char2 <='9')
int_ch2 = (hex_char2-48); //// 0 的Ascll - 48
else if(hex_char2 >= 'A' && hex_char2 <='F')
int_ch2 = hex_char2-55; //// A 的Ascll - 65
else
int_ch2 = hex_char2-87; //// a 的Ascll - 97
NSLog(@"i----%d---%d",i,hex_char2);
int_ch = int_ch1+int_ch2;
bytes[j] = int_ch; ///将转化后的数放入Byte数组里
j++;
}
Unlock();
NSData *newData = [[NSData alloc] initWithBytes:bytes length:8];
[self.sendTcpSocket writeData:newData withTimeout:-1 tag:0];
}
lock 是宏定义的信号量锁 貌似lock 并没有起到作用 如果在for循环里 还是对i操作的话 所以就去掉i++了 直接length/2了 还望大神指教
网友评论