美文网首页iOS Developer
iOS 16进制 转byte数组问题

iOS 16进制 转byte数组问题

作者: slimsallen | 来源:发表于2017-01-12 18:21 被阅读0次

    最近用到了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了        还望大神指教

    相关文章

      网友评论

        本文标题:iOS 16进制 转byte数组问题

        本文链接:https://www.haomeiwen.com/subject/tnfxbttx.html