2011-10-19 21:26:19 wqjtq 阅读数 78
  • 《C语言基础》 之 第10章 结构体

    课程内容:为什么需要结构体、定义一个结构体类型、结构体变量的声明和定义、sizeof测试结构体变量字节、结构体成员的普通访问方式、使用指针访问结构体成员、结构体嵌套、结构体传参、结构体数组。

    3287 人正在学习 去看看 张先凤
	/**
	 * 16进制的字符串表示转成字节数组
	 *
	 * @param hexString
	 *			16进制格式的字符串
	 * @return 转换后的字节数组
	 **/
	public static byte[] hexStr2ByteArray(String hexString) {
		if (StringUtils.isEmpty(hexString))
			throw new IllegalArgumentException("this hexString must not be empty");
 
		hexString = hexString.toLowerCase();
		final byte[] byteArray = new byte[hexString.length() / 2];
		int k = 0;
		for (int i = 0; i < byteArray.length; i++) {
						//因为是16进制,最多只会占用4位,转换成字节需要两个16进制的字符,高位在先
						//将hex 转换成byte   "&" 操作为了防止负数的自动扩展
						// hex转换成byte 其实只占用了4位,然后把高位进行右移四位
						// 然后“|”操作  低四位 就能得到 两个 16进制数转换成一个byte.
						//
			byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff);
			byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff);
			byteArray[i] = (byte) (high << 4 | low);
			k += 2;
		}
		return byteArray;
	}

   /**
    * 16进制字符串转换成byte数组
    * @param 16进制字符串
    * @return 转换后的byte数组
    */
  	public static byte[] hex2Byte(String hex) {
		String digital = "0123456789ABCDEF";
		char[] hex2char = hex.toCharArray();
		byte[] bytes = new byte[hex.length() / 2];
		int temp;
		for (int i = 0; i < bytes.length; i++) {
		// 其实和上面的函数是一样的 multiple 16 就是右移4位 这样就成了高4位了
		// 然后和低四位相加, 相当于 位操作"|" 
		//相加后的数字 进行 位 "&" 操作 防止负数的自动扩展. {0xff byte最大表示数}
			temp = digital.indexOf(hex2char[2 * i]) * 16;
			temp += digital.indexOf(hex2char[2 * i + 1]);
			bytes[i] = (byte) (temp & 0xff);
		}
		return bytes;
	}

 

2017-11-16 10:11:50 nanquan11 阅读数 1148
  • 《C语言基础》 之 第10章 结构体

    课程内容:为什么需要结构体、定义一个结构体类型、结构体变量的声明和定义、sizeof测试结构体变量字节、结构体成员的普通访问方式、使用指针访问结构体成员、结构体嵌套、结构体传参、结构体数组。

    3287 人正在学习 去看看 张先凤
由于项目需要跟进安卓端的16进制二维码段合法性验证,故根据安卓端部分java代码改编为oc代码。
/**
 *    @brief    将二进制数据转化为用字符表示的16进制数
 *
 *    @param     data 二进制数据
 *
 *    @return    字符表示的16进制数
 */
-(NSString *)HexStringWithData:(NSData *)data{
    Byte *bytes = (Byte *)[data bytes];
    NSString *hexStr=@"";
    for(int i=0;i<[data length];i++) {
        NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数
        if([newHexStr length]==1){
            hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
        }
        else{
            hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
        }    
    }
    hexStr = [hexStr uppercaseString];
    return hexStr;
}

-(Byte)toByte:(char)c {
    Byte b = (Byte)[@"0123456789ABCDEF" rangeOfString:[NSString stringWithFormat:@"%c", c]].location;
    return b;
}
/**
 *  演算CRC
 *  @param str
 */
-(NSString *)generateCRC:(NSString *)str{
    //把16进制字符串转换成字节数组
    long len = ([str length]/   2);
    Byte result[len];
    char achar[[str length]];
    memcpy(achar, [[str uppercaseString] cStringUsingEncoding:NSASCIIStringEncoding], 2*[[str uppercaseString] length]);
    for (int i = 0; i<len; i++) {
        int pos = i *2;
        result[i] = (Byte)([self toByte:achar[pos]] <<   4 | [self toByte:achar[pos+1]]);
        NSLog(@"result[i]:%d",result[i]);
    }

    Byte check[1];
    NSString *hexStr=@"";
    for (int i = 0; i<len; i++) {
        if (i == 0) {
            check[0] = result[0];
        }else{
            check[0] ^=result[i];
        }
    }
    NSLog(@"check[0]:%d",check[0]);

    NSData *adata = [[NSData alloc] initWithBytes:check length:1];
    hexStr = [self HexStringWithData:adata];
    hexStr = [hexStr uppercaseString];
    return hexStr;
}

附:java部分源代码

private static byte toByte(char c) {
        byte b = (byte) "0123456789ABCDEF".indexOf(c);
        return b;
    }
     /**
     * 把16进制字符串转换成字节数组
     * 
     * @param hex
     *            16进制字符串
     * @return 字节数组
     */
    public static byte[] hexStringToByte(String hex) {

        int len = (hex.length() /   2);
        byte[] result = new byte[len];
        char[] achar = hex.toUpperCase().toCharArray();
        for (int i =   0; i < len; i++) {
            int pos = i *   2;
            result[i] = (byte) (toByte(achar[pos]) <<   4 | toByte(achar[pos +   1]));
        }
        return result;
    }
    /**
     * 把字节数组转换成16进制字符串
     * 
     * @param bArray
     *            字节数组
     * @return 字符串
     */
    public static final String bytesToHexString(byte[] bArray) {
        if (bArray == null)
            return "";
        StringBuffer sb = new StringBuffer(bArray.length);
        String sTemp;
        for (int i =   0; i < bArray.length; i++) {
            sTemp = Integer.toHexString(0xFF & bArray[i]);
            if (sTemp.length() <   2)
                sb.append(  0);
            sb.append(sTemp.toUpperCase());
        }
        return sb.toString();
    }
     /**
     * 演算crc
     * @param str
     * @return
     */
    public static String generateCRC(String str)
    {
        byte[] bytes = hexStringToByte(str);
        for(int i = 0;i<bytes.length;i++){
            System.out.println("---"+bytes[i]);
        }
        byte[] check = new byte[1];
        for(int i = 0;i<bytes.length;i++)
        {
            if(i == 0)
            {
                check[0] = bytes[0];
            }else
            {
                check[0] ^= bytes[i];
            }
        }
        for(int i = 0;i<check.length;i++){
            System.out.println(check[i]);
            System.out.println(bytesToHexString(check));
        }

        return bytesToHexString(check);
    }
2012-11-05 09:16:48 sunshinexyj 阅读数 1400
  • 《C语言基础》 之 第10章 结构体

    课程内容:为什么需要结构体、定义一个结构体类型、结构体变量的声明和定义、sizeof测试结构体变量字节、结构体成员的普通访问方式、使用指针访问结构体成员、结构体嵌套、结构体传参、结构体数组。

    3287 人正在学习 去看看 张先凤
Object-C 从字符串中取16进制数到byte数组
将字符串的空格去除后,将每两个字符转换为一个byte
如果字符串中的16进制数格式不正确,则返回nil
//从字符串中取字节数组
-(NSData*)stringToByte:(NSString*)string
{
    NSString *hexString=[[string uppercaseString] stringByReplacingOccurrencesOfString:@" " withString:@""];
    if ([hexString length]%2!=0) {
        return nil;
    }
    Byte tempbyt[1]={0};
    NSMutableData* bytes=[NSMutableData data];
    for(int i=0;i<[hexString length];i++)
    {
        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
            return nil;
        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
            return nil;
      
        tempbyt[0] = int_ch1+int_ch2;  ///将转化后的数放入Byte数组里
        [bytes appendBytes:tempbyt length:1];
    }
    return bytes;
}

若格式不正确则返回nil
2015-12-29 16:23:29 u013428812 阅读数 1701
  • 《C语言基础》 之 第10章 结构体

    课程内容:为什么需要结构体、定义一个结构体类型、结构体变量的声明和定义、sizeof测试结构体变量字节、结构体成员的普通访问方式、使用指针访问结构体成员、结构体嵌套、结构体传参、结构体数组。

    3287 人正在学习 去看看 张先凤

最近自己也在做蓝牙开发,发现好多做蓝牙开发的都没有接触过C ,字节转换更是晕乎乎的,所以写下此篇博客,提供我转换的方法。

一、整形装换成两个字节

    

    int value = 456;

    unsigned char  byte1 = (value & 0xff00)>>8; //8

    unsigned char  byte2 = (value & 0xff);//8

    

    NSLog(@"byte1= %x   byte2= %x ",byte1,byte2);

  

        byte1 = 1;  byte2= c8;

二、两个字节转换成十进制整数

    char bytes[]={byte1,byte2};

    unsigned char  by1 = (bytes[0] & 0xff); //8

    unsigned char  by2 = (bytes[1] & 0xff);//8

    int   temp  = (by2|(by1<<8));

    NSLog(@"temp = %d",temp);

    

    temp = 456;

三、整形装换成三个字节

    int value =134456;

    unsigned char  byte1 = (value & 0xff0000)>>16;//最高8

    unsigned char  byte2 = (value & 0xff00)>>8;//中间8

    unsigned char  byte3 = (value & 0xff);//8

    

    NSLog(@"byte1= %x   byte2= %x byte3= %x ",byte1,byte2,byte3);

    byte1= 2   byte2= d byte3= 38


四、三个字节转换成十进制整数

    char bytes[]={byte1,byte2,byte3};

    unsigned char  by1 = (bytes[0] & 0xff); //8

    unsigned char  by2 = (bytes[1] & 0xff);//8

    unsigned char  by3 = (bytes[2] & 0xff);//8

    

    int   temp  = (by3|(by2<<8)|(by1<<16));

    NSLog(@"temp = %d",temp);

   temp = 134456

如果还有更多的自己接需要转换以此类推


2016-11-24 15:57:17 dkq972958298 阅读数 7416
  • 《C语言基础》 之 第10章 结构体

    课程内容:为什么需要结构体、定义一个结构体类型、结构体变量的声明和定义、sizeof测试结构体变量字节、结构体成员的普通访问方式、使用指针访问结构体成员、结构体嵌套、结构体传参、结构体数组。

    3287 人正在学习 去看看 张先凤

其中将十六进制字符串转换成NSData的代码如下:

- (NSData *)convertHexStrToData:(NSString *)str {
    if (!str || [str length] == 0) {
        return nil;
    }
    
    NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];
    NSRange range;
    if ([str length] % 2 == 0) {
        range = NSMakeRange(0, 2);
    } else {
        range = NSMakeRange(0, 1);
    }
    for (NSInteger i = range.location; i < [str length]; i += 2) {
        unsigned int anInt;
        NSString *hexCharStr = [str substringWithRange:range];
        NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];
        
        [scanner scanHexInt:&anInt];
        NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];
        [hexData appendData:entity];
        
        range.location += range.length;
        range.length = 2;
    }
    
    LEDEBUG(@"hexdata: %@", hexData);
    return hexData;
}

将NSData转换成十六进制的字符串则可使用如下方式:


- (NSString *)convertDataToHexStr:(NSData *)data {
    if (!data || [data length] == 0) {
        return @"";
    }
    NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
    
    [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
        unsigned char *dataBytes = (unsigned char*)bytes;
        for (NSInteger i = 0; i < byteRange.length; i++) {
            NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
            if ([hexStr length] == 2) {
                [string appendString:hexStr];
            } else {
                [string appendFormat:@"0%@", hexStr];
            }
        }
    }];
    
    return string;
}





没有更多推荐了,返回首页