【问题标题】:I am converting NSString a=@"0x401A" into int16_t?我正在将 NSString a=@"0x401A" 转换为 int16_t?
【发布时间】:2017-03-29 12:10:58
【问题描述】:

为什么当我尝试转换时,它会将十六进制值转换为整数?

unsigned int outVal;
NSScanner* scanner = [NSScanner scannerWithString:final1];
[scanner scanHexInt:&outVal];
NSLog(@"%u",outVal);

我尝试做的另一种方法是将它转换为正常的 integer 它给了我 0 值。 我只想要相同的字符:

int16_t a=0x401A;

我从用户那里得到这个数字,所以我没有控制权自己定义它。我想删除引号和数据类型 int16_t 以便我可以执行命令。

【问题讨论】:

  • 如果您在 NSLog 中使用十六进制格式 (@"%X"),您会看到正确的值吗?
  • 是的,我看到了正确的值,但我需要以整数形式将命令传递给 BLE 设备
  • 你没有抓住重点。整数具有正确的数值;您将其视为十六进制还是十进制只是您在NSLog() 中使用的格式字符串的一个函数。
  • 但 BLE 设备只接受这种格式的 0x401A 中的命令。如果我将此十六进制转换为整数,那么我会错过这个“0x”,那么蓝牙设备会认为错误的命令。
  • “0x”是字符串的一部分。它不是整数值的一部分。如果设备需要在命令中看到“0x”,那么它希望您发送一个字符串。

标签: ios objective-c nsstring ios-bluetooth


【解决方案1】:

我自己找到了解决方案

首先是把数据转换成字节的函数

    - (NSData *)dataWithString:(NSString *)hexstring
{
    NSMutableData* data = [NSMutableData data];
    int idx;
    for (idx = 0; idx+2 <= hexstring.length; idx+=2) {
        NSRange range = NSMakeRange(idx, 2);
        NSString* hexStr = [hexstring substringWithRange:range];
        NSScanner* scanner = [NSScanner scannerWithString:hexStr];
        unsigned int intValue;
        [scanner scanHexInt:&intValue];
        [data appendBytes:&intValue length:1];
    }
    return data;
}

并通过在将发送到BLE的命令中提供参数来调用函数

NSData * data = [self  dataWithString: @"401A"];
[peripheral writeValue:data forCharacteristic:characteristic                                       
                            type:CBCharacteristicWriteWithResponse];

通过此代码,任何人都可以将字符串发送到 BLE 设备。谢谢和干杯

【讨论】:

    猜你喜欢
    • 2015-10-22
    • 2018-09-07
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多