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;
	}

 

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
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);
    }
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

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


2015-08-15 16:22:25 alves139628 阅读数 1457
  • 《C语言基础》 之 第10章 结构体

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

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

最近做3des加密的时候,服务器返回的byte数组作为密钥,网上的方法都是以字符串作为密钥。先将字符串进行utf8编码,再转换成data,这样和直接用byte数组进行加密是有区别的,转换后的data字节数增加了一倍,这时候怎么办呢?

首先 对密钥字符串进行处理,把16进制字符串转换为byte数组(nadata)

- (NSData *) stringToHexData
{
    int len = [self length] / 2;    // Target length
    unsigned char *buf = malloc(len);
    unsigned char *whole_byte = buf;
    char byte_chars[3] = {'\0','\0','\0'};

    int i;
    for (i=0; i < [self length] / 2; i++) {
        byte_chars[0] = [self characterAtIndex:i*2];
        byte_chars[1] = [self characterAtIndex:i*2+1];
        *whole_byte = strtol(byte_chars, NULL, 16);
        whole_byte++;
    }

    NSData *data = [NSData dataWithBytes:buf length:len];
    free( buf );
    return data;
}

这样就得到了data的密钥,然后进行3des加密

+(NSString*)TripleDES:(NSString*)plainText  andCCOperation:(CCOperation )encryptOrDecrypt  anddata:(NSData*)data
{

    const void *vplainText;
    size_t plainTextBufferSize;

    if (encryptOrDecrypt == kCCDecrypt)//解密
    {
        NSData *EncryptData = [GTMBase64 decodeData:[plainText dataUsingEncoding:NSUTF8StringEncoding]];
        plainTextBufferSize = [EncryptData length];
        vplainText = [EncryptData bytes];
    }
    else //加密
    {
        NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
        plainTextBufferSize = [data length];
        vplainText = (const void *)[data bytes];
    }

    CCCryptorStatus ccStatus;
    uint8_t *bufferPtr = NULL;
    size_t bufferPtrSize = 0;
    size_t movedBytes = 0;

    bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, bufferPtrSize);
    // memset((void *) iv, 0x0, (size_t) sizeof(iv));

    //const void *vkey = (const void *)[DESKEY UTF8String];
    const void *vkey = (const void *)[data bytes];

    // NSString *initVec = @"init Vec";
    //const void *vinitVec = (const void *) [initVec UTF8String];
    //  Byte iv[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
    ccStatus = CCCrypt(encryptOrDecrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding | kCCOptionECBMode,
                       vkey,
                       kCCKeySize3DES,
                       nil,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);
       NSString *result;

    if (encryptOrDecrypt == kCCDecrypt)
    {
        result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr
                                                                length:(NSUInteger)movedBytes]
                                        encoding:NSUTF8StringEncoding];
    }
    else
    {
        NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
        result = [GTMBase64 stringByEncodingData:myData];
    }

    return result;
}

ok,这样就可以得到加密后的结果了

LLDB部分指令

阅读数 61

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