Symbian中的String和Descriptors(zt)

SDK中关于Descriptor的论述分散在几个地方,使人看不到其全貌,而这个东西又实在太重要,所幸newlc的eric为我们总结了一些,现在翻译如下
------------------------------------------------------------------------------------------------  

        在symbian系统中并没有使用我们熟知的类型和函数来处理字符串和二进制缓冲区,这对于初学者来说可能有点陌生。大概很多编程者都在摸索TBuf,  TBufC,  HBufC的过程中花费了不少时间……:)

        symbian中的描述符(descriptors)主要有以下特性:
1、以同样的方式对待字符串和二进制数据。
2、数据可以存放在内存的任何区域上——ROM或RAM,在堆或栈上都可以。
3、描述符使用指针和长度信息来描述它包含的数据,有些描述符还包括最大长度的信息。

        下面这个图示意了描述符相关类的继承关系:


        所有的描述符都是从抽象类TDesC中派生的,他们可以分为三个大类:
1、缓冲区描述符——数据做为描述符对象的组成部分而存在,描述符对象存放在程序的堆栈中:TBuf和TBufC,
2、堆描述符——数据做为描述符对象的组成部分而存在,描述符对象存放在堆中:HBufC,
3、指针描述符——描述符对象和它所表示的实际数据是分开存放的:TPtr和TPtrC.

      如果对照C/C++语法来看:
1、TPtrC可以被看作是const  char*的使用
2、TBufC可以被看作是char[]的使用

        其他类没有相应对照语句。

        下面显示了各个类中数据是如何组织的:


        TDes和TDesC是抽象类,因此你不可能实例化它们。它们的主要用途是做为函数的参数来描述字符串和二进制数据。在这样的函数中,你应该按如下规则使用:
1、const  TDesC&  表示只读的数据和字符串。
2、TDes&  表示可以被修改的数据和字符串。

        所有这些描述符都可以指定数据尺度:TDes8、TDes16、TDesC8、TDesC16、TBuf8、TBuf16等
这里8表示描述符处理的数据是8bit的,而16表示是16bit数据。一般来说,你只要使用通用形式(TDes,  TDesC,...)来表示文本数据而使用8bit版本(TDesC8等)来表示二进制的内容。


Litterals
---------------
字符串常量可以使用_L()或_LIT()宏来定义。

_L()可以生成一个指向字符值的地址(TPtrC),它经常被用来传递字符串到函数中:
NEikonEnvironment::MessageBox(_L("Error:  init  file  not  found!"));

_LIT()可以生成个常量名,以便以后重复使用:
_LIT(KMyFile,  "c:/System/Apps/MyApp/MyFile.jpg");

_LIT()宏的结果(就是上面的KMyFile)实际上是个文字描述符(literal  descriptor)TLitC,它可以在任何使用TDesC&的地方使用。


用法
---------
        TDesC中最常用的函数如下:
1、Ptr(),用来获得描述符数据中的指针。
2、Length(),用来获得描述符数据中的字符数。
3、Size(),用来获得描述符数据中的字节数目。
4、Cpmpare()或操作符==、!=、>=和<=等专为比较描述符数据用的。
5、操作符[],可以被当作c/c++中一样,用来获得描述符字符串中的单个字符。

        下面几个函数有其特殊性:
1、Append()和Num()有很多重载形式,具体可以看SDK
2、Compare()有2个变体:CompareC()和CompareF(),以及Copy(),Find(),Locate()和Match(),这些函数都有C/F的后缀形式,C代表Collated而F代表Folded.

Collating和Folding
------------------------
Folding是个比较格式化文本的简单方法,主要用在对比较不是太要求精确的场合。

Collation是个更好的也更有效的比较字符串的方法,可以生成类似字典的顺序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
`gattc_discover_descriptors` 函数是 MicroPython 提供的一个 BLE(蓝牙低功耗)相关函数,用于发现指定特征值的所有描述符。该函数的使用方法如下: ```python gattc_discover_descriptors(conn_handle, char_handle) ``` 其,`conn_handle` 为连接句柄(通过 `gap_connect` 函数建立),`char_handle` 为特征值句柄(通过 `gattc_discover_characteristics` 函数发现)。 该函数会返回一个包含所有描述符 UUID 的列表(每个 UUID 都是一个 `bytes` 类型的对象),如果发现失败则返回 `None`。 以下是一个示例代码,用于发现指定 BLE 设备指定服务指定特征值的所有描述符 UUID: ```python from ubluetooth import BLE, UUID, FLAG_NOTIFY, FLAG_READ, FLAG_WRITE import time # 定义要连接的 BLE 设备及服务、特征值的 UUID device_mac = b'\x00\x00\x00\x00\x00\x00' # 你要连接的设备 MAC 地址 service_uuid = UUID(b'6E400001-B5A3-F393-E0A9-E50E24DCCA9E') char_uuid = UUID(b'6E400003-B5A3-F393-E0A9-E50E24DCCA9E') # 实例化 BLE 对象 ble = BLE() # 连接设备 conn = ble.gap_connect(device_mac) # 发现服务 services = ble.gattc_discover_services(conn) service = None for s in services: if s.uuid == service_uuid: service = s break # 发现特征值 characteristics = ble.gattc_discover_characteristics(service.handle_start, service.handle_end) characteristic = None for c in characteristics: if c.uuid == char_uuid: characteristic = c break # 发现特征值的所有描述符 descriptors = ble.gattc_discover_descriptors(conn, characteristic.handle) if descriptors is not None: for d in descriptors: print('Descriptor UUID:', d) else: print('Discover descriptors failed') # 断开连接 ble.gap_disconnect(conn) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值