iOS BCD码、数据流、字节和MD5计算
一、各个之间的相互转换
1、字符串转数据流NSData
NSString *str = @"abc123";
NSData *dd = [str dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",dd); // dd = <61626331 3233>
通过打印转换后的数据流可以看到,数据流里是两位一个字节存储字符串ASCII码的十六进制,a = 97 = 0x61, 1 = 49 = 0x31
2、字节与数据流转换
Byte bb[] = {,,,,,};
NSData *dd = [[NSData alloc]initWithBytes:bb length:];
NSLog(@"%@",dd); // dd = <61626331 3233> 打印的结果和字符串转换是一样的
//数据流转字节
Byte *bb = (Byte *)[dd bytes];
3、根据需要直接变成NSData,倒过来同理NSData转字符串也是先变成字节在转字符串
NSString *bcdstr = @"";
int leng = (int)bcdstr.length/;
if (bcdstr.length% == ) //判断奇偶数
{
leng +=;
}
Byte bbte[leng];
for (int i = ; i<leng-; i++)
{
bbte[i] = (int)strtoul([[bcdstr substringWithRange:NSMakeRange(i*, )]UTF8String], , );
}
if (bcdstr.length% == )
{
bbte[leng-] = (int)strtoul([[bcdstr substringWithRange:NSMakeRange((leng - )*, )]UTF8String], , ) *;
}else
{
bbte[leng-] = (int)strtoul([[bcdstr substringWithRange:NSMakeRange((leng - )*, )]UTF8String], , );
}
NSData *de = [[NSData alloc]initWithBytes:bbte length:leng];
NSLog(@"%@",de); //<61626331 3233>
4、十六进制转成ASCII
//十六进制转ASCII 31 = 1 44 = D
-(NSString *)stringFromHexString:(NSString *)hexString
{
char *myBuffer = (char *)malloc((int)[hexString length] / + );
bzero(myBuffer, [hexString length] / + );
for (int i = ; i < [hexString length] - ; i += ) {
unsigned int anInt;
NSString * hexCharStr = [hexString substringWithRange:NSMakeRange(i, )];
NSScanner * scanner = [[NSScanner alloc] initWithString:hexCharStr] ;
[scanner scanHexInt:&anInt];
myBuffer[i / ] = (char)anInt;
}
NSString *unicodeString = [NSString stringWithCString:myBuffer encoding:];
return unicodeString;
}
二、MD5计算
1、字符串的MD5计算
+(NSString *)md5HexDigest:(NSString *)str
{
const char *original_str = [str UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH]; //16
CC_MD5(original_str, (int)strlen(original_str), result);
NSMutableString *hash = [NSMutableString string];
for (int i = ; i < ; i++)
{
[hash appendFormat:@"%02x", result[i]];//两位表示 不足两位补0
}
return [hash lowercaseString];
}
2、字符串的MD5计算
+(NSString*)getMD5WithData:(NSData *)data
{
//不要把数据流先转成char,不然如果遇到00字节就不会计算00后面数据
unsigned char result[];
CC_MD5([data bytes], (int)[data length], result);
NSMutableString *hash = [NSMutableString string];
for (int i = ; i < ; i++)
{
[hash appendFormat:@"%02x", result[i]];//x就是小写的字母,X就是大写的字母,2个字节不足补0
}
return hash;
}
三、CRC16验证计算(需要一个头文件)
+(NSData *)crc16Digest:(NSData *)data
{
Byte *bs = (Byte *)[data bytes];
int len = (int)data.length;
unsigned char acc[len]; for (int i = ; i<len; i++)
{
acc[i] =bs[i];
}
unsigned short intup = CRC16(acc, len); //调用这个要导入1个头文件
NSString *str = [[NSString alloc]initWithFormat:@"%x",intup];
int b = -(int)str.length;
NSString *ss=[NSString new];
for (int i =; i<b; i++){
ss = [NSString stringWithFormat:@"0%@",ss];
}
ss = [NSString stringWithFormat:@"%@%@",ss,str];
//高低位转换
NSString *stra = [ss substringToIndex:];
NSString *end = [ss substringFromIndex:];
NSString *yy = [NSString stringWithFormat:@"%@%@",end,stra];
NSData *rrdata = [SingMent transcodebcd:yy];
return rrdata;
}
iOS BCD码、数据流、字节和MD5计算的更多相关文章
- 一种BCD码转换的算法
#include "stdio.h" typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef ...
- php UTF8 转字节数组,后使用 MD5 计算摘要
Hex.encodeHexString(md5.digest);按 UTF8 转字节数组,后使用 MD5 计算摘要,得到 16 字节数组,使用 Hex 转为长度为 32 的字符串,保持小写 bin2h ...
- Delphi中对BCD码的直接支持 (转)
最近在Delphi下写软件,需要将数据转换为BCD码和将BCD码转换为其它数据类型,从网上搜索了一下,没有发现好的函数,于是就想自定义函数来完成BCD与其它格式的数据转换功能.但最终没有动手写,先查查 ...
- C语言之linux内核--BCD码转二进制与二进制转BCD码(笔试经典)
在分析代码之前,我们先来了解一下,BCD码和二进制到底区别在哪? 学习过计算机原理的和数字电子技术这两门课的都会知道这两个到底是什么含义,也有的同学学过了,考过了,过了一段时间又忘记了,今天,我们通过 ...
- 二进制 转换成十进制 BCD码(加3移位法)
"原来的二进制数十几位,则左移时就要左移几位" "二进制数调整BCD码的方法是将二进制码左移8次,每次移位后都检查低四位LSD+3是否大于7,如是则加3,否则不加,高4位 ...
- BCD码
BCD码(Binary-Coded Decimal)亦称二进码十进数或二-十进制代码,是用4位二进制数来表示1位十进制数中的0~9这10个数码,用一种使用二进制编码十进制的数字编码形式.BCD码这种 ...
- 汇编_压缩BCD码和非压缩BCD码
BCD码是表示十进制数的,非压缩BCD码是用8位表示的,其实只用低4位,高4位全为0. 例如,十进制数36,用非压缩BCD码表示为:0000 0011 0000 0110 ,这是两个字节. 压缩BCD ...
- Cocos Creator 热更新文件MD5计算和需要注意的问题
Creator的热更新使用jsb.热更新基本按照 http://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update.html?h=% ...
- S5Time BCD码存储
,时基为1秒. 当使用S5TIME时,定义数值的范围为0~999,而且要指明使用的时基.时基指定了时间单位. S5TIME时基及相应的时间范围如下: 时基 BCD码 时间范围 10 ms 00 10 ...
随机推荐
- 【Java源码解析】Thread
简介 线程本质上也是进程.线程机制提供了在同一程序内共享内存地址空间运行的一组线程.对于内核来讲,它就是进程,只是该进程和其他一下进程共享某些资源,比如地址空间.在Java语言里,Thread类封装了 ...
- 利用BlockingCollection实现生产者和消费者队列,实现写文本
最近开发几个小项目,需要把结果写到txt文件里面,并且按照时间进行分文件,由于对于效率要求较高,所以采用 生产者和消费者 模型来进行写出文本,线程中只需要添加队列就立即返回,而不需要等待写文件的时间 ...
- asp.net core 发布到docker 极简步骤
1.使用dotnet命令发布项目 2.把发布成功的文件通过scp等工具发布到linux服务器上,在当前目录下新建一个dockerfile 3.使用asp.net core镜像为底包构建一个新的镜像 4 ...
- 阿里云Linux的mysql安装,使用yum安装
1.下载 我下载的mysql5.7 rpm格式的,在Linux的根目录下下载(防止出现安装的问题) wget https://dev.mysql.com/get/mysql57-community-r ...
- Unity3D — — UGUI之RectTransform
Mask.GetComponent<RectTransform>().anchoredPosition(子物体) = hotKey_image.rectTransform.anchored ...
- 为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname
之前总结了 jmeter 分布式测试的过程,在部署过程中提到,要在 system.properties 中配置自己的 IP. 至于为什么要这么做,源于这一次 debug 的过程. 运行环境 mint, ...
- 基于C#的机器学习--贝叶斯定理-执行数据分析解决肇事逃逸之谜
贝叶斯定理-执行数据分析解决肇事逃逸之谜 在这一章中,我们将: 应用著名的贝叶斯定理来解决计算机科学中的一个非常著名的问题. 向您展示如何使用贝叶斯定理和朴素贝叶斯来绘制数据,从真值表中发现异常值 ...
- gzip命令详解
基础命令学习目录首页 好文链接:https://blog.csdn.net/m0_38132420/article/details/78577247 原文链接:http://www.cnblogs.c ...
- traceroute命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/peida/archive/2013/03/07/2947326.html 通过traceroute我们可以知道信息从你 ...
- ltrace命令详解
原文链接:https://ipcmen.com/ltrace 用来跟踪进程调用库函数的情况 补充说明 NAME ltrace - A library call tracer ltrace命 ...