由于项目需要跟进安卓端的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);
}