蓝牙开发问题,蓝牙命令,十六进制字符串转bytes问题,请各位大神帮忙看看!!

m0_37633669 2018-04-11 06:27:56
//传入一个16进制字符串:@"328A6102033B516386668561DF5F0B7E"
-(void)getByteWithString:(NSString *)string
{
NSMutableArray *strMutArr = [[NSMutableArray alloc]init];
for (int i = 0; i < string.length; i += 2)
{
NSString *str = [NSString stringWithFormat:@"0x%@",[string substringWithRange:NSMakeRange(i, 2)]];
[strMutArr bd_addObject:str];
}
//strMutArr打印结果:Printing description of strMutArr:<__NSArrayM 0x145db8730>(0x32,0x8A,0x61,0x02,0x03, 0x3B,0x51,0x63,0x86,0x66,0x85,0x61,0xDF,0x5F,0x0B,0x7E)
Byte bytes[16];
for (int j = 0; j < strMutArr.count; j++)
{
const char *c = [strMutArr[j] UTF8String];
Byte byte = (Byte)strtol(c, NULL, 16);
bytes[j] = byte;
}
//bytes结果:(Byte [16]) bytes = {
// [0] = '2'
// [1] = '\x8a'
// [2] = 'a'
// [3] = '\x02'
// [4] = '\x03'
// [5] = ';'
// [6] = 'Q'
// [7] = 'c'
// [8] = '\x86'
// [9] = 'f'
// [10] = '\x85'
// [11] = 'a'
// [12] = '\xdf'
// [13] = '_'
// [14] = '\v'
// [15] = '~'
//}
}



现在想要的结果是和strMuatle结果一一对应如下:
bytes结果:(Byte [16]) bytes = {
[0] = '\x32'
[1] = '\x8a'
[2] = '\x61'
[3] = '\x02'
[4] = '\x03'
[5] = '\x3b'
[6] = '\x51'
[7] = '\x63'
[8] = '\x86'
[9] = '\x66'
[10] = '\x85'
[11] = '\x61'
[12] = '\xdf'
[13] = '\x5f'
[14] = '\x0b'
[15] = '\x7e'
}
但一直不能成功....

Byte byte = (Byte)strtol(c, NULL, 16); 这个方法对于一些十六进制数有时候可以转化成对应的byte,有时候不能,不知道为什么,请大家帮我看看,给点建议,如何才能转换成功。
...全文
3257 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwasd116 2019-06-11
  • 打赏
  • 举报
回复
NSLog(@"%@",[self hexStringToByte:@"328A6102033B516386668561DF5F0B7E"]);

//从字符串中取字节数组 转成NSdaTa
-(NSData *)hexStringToByte:(NSString*)string {

NSString *hexString=[[string uppercaseString] stringByReplacingOccurrencesOfString:@"-" withString:@""];
if ([hexString length]%2!=0) {
return nil;
}
NSData * data = [hexString dataUsingEncoding:NSUTF8StringEncoding];
Byte *testByte = (Byte *)[data bytes];
Byte testByteArr[16] = {0};
for (int i=0; i<16; i++) {
int post = i*2;
testByteArr[i] = (Byte)(([self toByte:testByte[post]]<<4)|([self toByte:testByte[post+1]]));
NSLog(@"====1122==%02x",testByteArr[i]);
// NSLog(@"====1122==%d",testByteArr[i]);
}
return [NSData dataWithBytes:testByteArr length:16];
}

2019-06-11 10:05:57.401682+0800 UDPSocket[2619:831828] ====1122==32
2019-06-11 10:05:57.401710+0800 UDPSocket[2619:831828] ====1122==8a
2019-06-11 10:05:57.401718+0800 UDPSocket[2619:831828] ====1122==61
2019-06-11 10:05:57.401725+0800 UDPSocket[2619:831828] ====1122==02
2019-06-11 10:05:57.401732+0800 UDPSocket[2619:831828] ====1122==03
2019-06-11 10:05:57.401739+0800 UDPSocket[2619:831828] ====1122==3b
2019-06-11 10:05:57.401746+0800 UDPSocket[2619:831828] ====1122==51
2019-06-11 10:05:57.401753+0800 UDPSocket[2619:831828] ====1122==63
2019-06-11 10:05:57.401760+0800 UDPSocket[2619:831828] ====1122==86
2019-06-11 10:05:57.401766+0800 UDPSocket[2619:831828] ====1122==66
2019-06-11 10:05:57.401773+0800 UDPSocket[2619:831828] ====1122==85
2019-06-11 10:05:57.401779+0800 UDPSocket[2619:831828] ====1122==61
2019-06-11 10:05:57.401785+0800 UDPSocket[2619:831828] ====1122==df
2019-06-11 10:05:57.401792+0800 UDPSocket[2619:831828] ====1122==5f
2019-06-11 10:05:57.401798+0800 UDPSocket[2619:831828] ====1122==0b
2019-06-11 10:05:57.401805+0800 UDPSocket[2619:831828] ====1122==7e
2019-06-11 10:05:57.401849+0800 UDPSocket[2619:831828] <328a6102 033b5163 86668561 df5f0b7e>
天材地宝 2019-04-28
  • 打赏
  • 举报
回复
NSLog(@"data %@", [self dataConvertToHexString:@"328A6102033B516386668561DF5F0B7E"]);

打印结果:data <328a6102 033b5163 86668561 df5f0b7e>


- (NSData *)dataConvertToHexString:(NSString *)hexString
{
const char *chars = [hexString UTF8String];
int i = 0;
NSUInteger len = hexString.length;
NSMutableData *data = [NSMutableData dataWithCapacity:len / 2];
char byteChars[3] = {'\0','\0','\0'};
unsigned long wholeByte;
while (i < len) {

byteChars[0] = chars[i++];
byteChars[1] = chars[i++];

wholeByte = strtoul(byteChars, NULL, 16);
[data appendBytes:&wholeByte length:1];
}

return data;
}
dennis_ben 2018-06-19
  • 打赏
  • 举报
回复
-(NSData*)hexToBytes:(NSString*)str{ NSMutableData* data = [NSMutableData data]; int idx; for (idx = 0; idx+2 <= str.length; idx+=2) { NSRange range = NSMakeRange(idx, 2); NSString* hexStr = [str substringWithRange:range]; NSScanner* scanner = [NSScanner scannerWithString:hexStr]; unsigned int intValue; [scanner scanHexInt:&intValue]; [data appendBytes:&intValue length:1]; } return data; } 不过是二位二位的转的
  • 打赏
  • 举报
回复
有些转换容易歧义的
qq_38546055 2018-04-18
  • 打赏
  • 举报
回复
Nsscaner
qq_38546055 2018-04-18
  • 打赏
  • 举报
回复
nsscaner,可以把字符串转16进制int
课程目标:学习Java语言中字符串相关的知识、字符编码常识和正则表达式的使用,并完成案例前导课程:《Java工程师必学系列课程》前4部课程内容:本课程是《Java工程师必学系列课程》的第5部分,主要讲解Java语言中字符串相关知识、字符编码常识和正则表达式的使用。本课程涉及的主要内容可以分为四部分:一、String、StringBuffer和StringBuilder类基本常识、基本原理和使用技巧二、字符编码常识三、Java语言正则表达式的详细语法和使用技巧四、实战案例课程说明:在开发Java程序的过程中,最常用的类莫过于字符串相关的类。可以毫不夸张的说,任何一个Java程序,都离不开对字符串保存和处理。很多学员对字符串的理解只是处于比较粗浅的阶段。殊不知,如果对字符串处理的不好,会影响到软件的运行效率。本课程专门讲解字符串相关的知识,将从字符串的存储方式、底层的运行方式等各方面深入讲解其中的原理和技巧。此外,对字符串进行更高级的处理,又要用到正则表达式的相关知识。正则表达式广泛应用于各种与字符串处理相关的场合。它是一套独立的语言系统,经过几十年的完善和发展,现在已经非常的强大,并且形成了国际标准。各种高级编程语言,都实现了自己的表达式引擎。本课程详细的讲解了Java语言中正则表达式的语法和使用技巧。掌握了正则表达式,对编程水平的提高有非常大的帮助!同时,本课程在最后一部分,安排了非常精彩的、完整的实战案例,通过实战的形式切实帮助学员提高解决具体问题的能力!预期效果:认真学习完本课程,学员可以掌握字符串处理及正则表达式相关的系统知识,并能提高实际的编码水平。环境配置要求:学习本课程需安装JDK1.8或更高版本的JDK,以便程序能正确运行,建议使用IntelliJ IDEA 2019.1.2或更高版本的开发工具。    因有合作协议约束,《穆哥学堂》只提供PDF版本的课件!

29,031

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧