Trong Symbian, để xử lý chuỗi text hay nhị phân, ta sử dụng các descriptor sau: Tbuf, TBufC, HbufC…

Các đặc điểm chính trong Descriptor của Symbian:

  • Dữ liệu text và nhị phân được xử lý theo cùng một cách.
  • Dữ liệu có thể được lưu trữ ở bất kỳ đâu trong bộ nhớ, có thể ROM, RAM, Stack hay Heap.
  • Một đối tượng Descriptor duy trì con trỏ pointer và thông tin độ dài(length) để mô tả dữ liệu của nó. Một vài Descriptor còn có thể chứa cả max length.

Biểu đồ Class Diagram của các Descriptor trong Symbian như sau:

Tất cả các Descriptor(ngoại trừ TDesC) đều kế thừa từ lớp abstract TDesC. Chúng được chia làm 3 loại sau:

  • Buffer Descriptor: Đó là nơi mà dữ liệu là một thành phần của đối tượng Descriptor và đối tượng này được lưu trữ trong Stack, chẳng hạn như TBuf hay TBufC.
  • Heap Descriptor: Tham chiếu đến dữ liệu được lưu trữ trên Heap mà thuộc sở hữu bởi Descriptor, có thể thiết lập lại max length của Descriptor, chẳng hạn như HBufC, RBuf.
  • Pointer Descriptor: Tham chiếu đến dữ liệu được lưu trữ ở nơi khác mà không thuộc sở hữu bởi Descriptor, chẳng hạn như TPtr hay TPtrC.

Có một sự tương đồng trong C/C++ truyền thống, đó là:

  • TPtrC được hiểu như constant char *.
  • TBuf được hiểu như char[].

Sau đây mà hình vẽ minh họa cách thức tổ chức dữ liệu đối với mỗi lớp:

TDes và TDesC là các lớp Abstract nên bạn không thể sử dụng chúng để khởi tạo, chúng thường được sử dụng làm đối số trong các phương thức xử lý chuổi text hay nhị phân. Cách sử dụng chúng làm đối số của phương thức như sau:

  • const TDesC&: cho các chuỗi hay dữ liệu chỉ đọc(read-only).
  • TDes&: gán chuỗi hay dữ liệu mà bạn muốn sửa đổi.

Tất cả các Descriptor đều có các kiểu mở rộng đặc biệt: TDes8, TDes16, TDesC8, TDesC16, TBuf8, TBuf16… trong đó 8 chỉ định rằng Descriptor sẽ xử lý 8bit dữ liệu, 16 thì xử lý 16bit dữ liệu.

Literals

Các chuỗi hằng thường được định nghĩa bởi các macros _L() hay _LIT().

_L(): tạo ra một TPtrC từ một giá trị literal, nó thường sử dụng để gán một chuỗi vào phương thức. Ví dụ:

NEikonEnvironment::MessageBox(_L(“Error: init file not found!”));

_LIT(): sinh ra một biến hằng, và có thể tái sử dụng chúng thông qua ứng dụng.

_LIT(KMyFile,”c:\\System\\Apps\\MyApp\\MyFile.jpg”);

Kết quả của macro _LIT()(KMyFile như ví dụ trên) là một Descriptor literal TLitC có thể sử dụng tương tự như TDesC&.

Trường hợp sử dụng

Các phương thức chung hay sử dụng được định nghĩa trong TDesC, đó là:

  • Ptr(): lấy về một con trỏ trên Descriptor data.
  • Length(): lấy về số lượng các ký tự trong Descriptor data.
  • Size(): lấy về số lượng byte trong Descriptor data.
  • Compare() hay các operator ==,!=, >= hay <= dùng để so sánh các dữ liệu trên Descriptor data.
  • Sử dụng operator [] để lấy về ký tự đơn (single char)  từ Descriptor data.

Ngoài ra, có một số phương thức có các biến thể, chẳng hạn như:

Compare() thì có CompareC() và CompareF(), tương tự như vậy đối với các phương thức Copy(), Find(), Locate() và Match(). Lưu ý rằng chữ ‘C’ chính là Collated, và ‘F’ là Folded, bạn có thể tìm hiểu chúng qua FORUM NOKIA LIBRARY.