データ型
アセンブラの魔女 ⧫ PTP ⧫ データ型
アセンブラの魔女 ⧫ PTP ⧫ データ型
 PTPでは、①「汎用データ型」(符号無し8ビット整数など)、②「特定の用途に用いられるデータ型」(SessionIDなど)、③「データセット」(DeviceInfoなど用途に特化したデータ構造)などのデータ型が定義されています。
汎用データ型
 整数型
 ハンドル型
 文字列型
 日付文字列型
 配列型
データコード
特定用途のデータ型
データセット

 PTPでは次のような汎用データ型(Simple Types)が定義されています。オペレーションによっては、転送データを特定のデータ型に限定せず自由度を高めている場合もあります。このような場合には、転送データがどのようなデータ型であるか示すために、それぞれの基本データ型にはデータタイプ コード(Datatype code)が定義されています。

汎用データ型とデータタイプ コード

データタイプ コードデータ型説明
0x0000UNDEF未定義
0x0001INT8符号付き整数8ビット
0x0002UINT8符号無し整数8ビット
0x0003INT16符号付き整数16ビット
0x0004UINT16符号無し整数16ビット
0x0005INT32符号付き整数32ビット
0x0006UINT32符号無し整数32ビット
0x0007INT64符号付き整数64ビット
0x0008UINT64符号無し整数64ビット
0x0009INT64符号付き整数128ビット
0x000AUINT128符号無し整数128ビット
0x4001AINT8符号付き整数8ビットの配列
0x4002AUINT8符号無し整数8ビットの配列
0x4003AINT16符号付き整数16ビットの配列
0x4004AUINT16符号無し整数16ビットの配列
0x4005AINT32符号付き整数32ビットの配列
0x4006AUINT32符号無し整数32ビットの配列
0x4007AINT64符号付き整数64ビットの配列
0x4008AUINT64符号無し整数64ビットの配列
0x4009AINT128符号付き整数128ビットの配列
0x400AAUINT128符号無し整数128ビットの配列
0xFFFFSTR可変長のUnicode文字列
その他のコードUndefinedReserved

PTPデータ型定義ファイル例(ptp_datatypes.h)

 PTPでは8ビットから128ビットまでの符号付き及び符号無し整数型(Integers)が定義されています。

INT8符号付き8ビット整数
UINT8符号無し8ビット整数
INT16符号付き16ビット整数
UINT16符号無し16ビット整数
INT32符号付き32ビット整数
UINT32符号無し32ビット整数
INT64符号付き64ビット整数
UINT64符号無し64ビット整数
INT128符号付き128ビット整数
UINT128符号無し128ビット整数

 これらの整数型は配列型の要素の型としても用いられます。

 PTPでは画像ファイルなどの特定のオブジェクトを転送したりする場合に、パスではなくオブジェクト ハンドル(ObjectHandle)を使います。そのために用いられるデータ型がハンドル型(Handles)です。

 ハンドル型は符号無し32ビット(UINT32)型のデバイス内でユニークな値となります。値の有効範囲は、0x00000001から0xFFFFFFFEまで。0x00000000と0xFFFFFFFFは特別な意味を持ち、その意味は「ハンドルが存在しない」、「デフォルトのハンドル」、「すべてのハンドル」など状況よって異なります。

 オブジェクトハンドルとオブジェクトの関係は、セッション終了後も保持し続ける必要がありますが、電源オフ後の再起動ではオブジェクトハンドルとオブジェクトの関係を再構築することができます。

 PTPの文字列型(Strings)は、文字数を示す先頭の1バイト(UINT8)の後に、ISO10646で定義されるUnicode文字列が続きます。Unicode文字列の最後には終端のNULLが必要となります。

オフセット
[byte]
フィールドサイズ
[byte]
データ型
0NumChars1UINT8
1StringChars可変長NULLで終端されたUnicode文字列

 空の文字列の場合、値ゼロのNumCharsフィールドのみが存在し、StringCharsフィールドは存在しません。

 日付文字列型(DateTime String)は日付や時刻を表すために用いられます。データ型は文字列型と同じですが、書式はISO 8601互換の"YYYYMMDDThhmmss.s"形式となります。

書式

YYYYMMDDThhmmss.s

フィールド意味
YYYY年(4桁の数字)
MM月(01~12)
DD日(01~31)
T常に'T'をセット
hh時(00~23)
mm分(00~59)
ss秒(00~59)
.s1/10秒(オプション)

 文字列の最後には協定世界時(UTC)であることを示すための'Z'を追加することができます。

例

20161201T1053Z

 文字列の最後に"+hhmm"または"-hhmm"を追加することで、そのタイムゾーンでのローカル時刻を示すことができます。

例

20161201T1053+0300

 PTPでは、8ビットから128ビットまでの符号付き整数、及び符号無し整数の配列(Arrays)が定義されています。

AINT8符号付き8ビット整数の配列
AUINT8符号無し8ビット整数の配列
AINT16符号付き16ビット整数の配列
AUINT16符号無し16ビット整数の配列
AINT32符号付き32ビット整数の配列
AUINT32符号無し32ビット整数の配列
AINT64符号付き64ビット整数の配列
AUINT64符号無し64ビット整数の配列
AINT128符号付き128ビット整数の配列
AUINT128符号無し128ビット整数の配列

 いずれの型も要素の型が異なるだけで基本構造は同じです。データの先頭には配列数を示すUINT32型のNumElementsフィールドが置かれ、その後に各要素が続きます。

オフセット
[byte]
フィールドサイズ
[byte]
0NumElements(UINT32型)4
1配列要素[0]ElementSize
1+ElementSize配列要素[1]ElementSize
:
1+ElementSize*(NumElements-1)配列要素[NumElements-1]ElementSize

 空の配列の場合、値ゼロのNumElementsフィールドのみが存在します。

 「データコード」(Datacodes)という言葉はPTPでは特別な意味を持ちます。データコードは符号無し16ビット整数(UINT16)型で上位4ビットがデータタイプを示すためのフィールドとして割り当てられています。オペレーション コードなど、PTPで頻繁に用いられるデータの多くはデータコードで表現されます。

Bit15Bit14Bit13Bit12Bit10-0コード タイプ
0000コード値Undefined
001標準オペレーションコード(OperationCode)
010標準レスポンスコード(ResponseCode)
011標準オブジェクトフォーマットコード(ObjectFormatCode)
100標準イベントコード(EventCode)
101標準デバイスプロパティコード(DevicePropCode)
110Reserved
111Reserved
1000Undefined
001ベンダー拡張オペレーションコード(OperationCode)
010ベンダー拡張レスポンスコード(ResponseCode)
011ベンダー拡張オブジェクトフォーマットコード(ObjectFormatCode)
100ベンダー拡張イベントコード(EventCode)
101ベンダー拡張デバイスプロパティコード(DevicePropCode)
110Reserved
111Reserved

 最上位ビット(bit15)が1のコードは、ベンダー拡張されたコードであることを意味します。

 PTPでは次のような特定用途のためのデータ型も定義されています。

型サイズ
[bytes]
フォーマット
OperationCode(オペレーションコード)2データコード (UINT16)
ResponseCode(レスポンスコード)2データコード (UINT16)
EventCode(イベントコード)2データコード UINT16)
DevicePropCode(デバイスプロパティコード)2データコード (UINT16)
ObjectFormatCode(オブジェクトフォーマットコード)2データコード (UINT16)
StorageID(ストレージID)4UINT32
ObjectHandle(オブジェクトハンドル)4UINT32
DeviceInfo可変長データセット
StorageInfo可変長データセット
ObjectInfo可変長データセット
DevicePropDesc可変長データセット
DevicePropDescEnum可変長列挙形式のDevicePropDesc
DevicePropDescRange可変長範囲表示形式のDevicePropDesc

 「データセット」(Datasets)とは、互いに関連するデータの集合体でUSBのディスクリプタのような役割やデータ構造を持つデータです。単純な構造の数バイトのデータなら、オペレーションやレスポンスのパラメータを使ってやり取りすることができますが、PTPで定義される複雑で規模の大きなデータはデータセットを使ってトランザクション フェーズのデータフェーズで転送されます。

 データセット中の使わないフィールドにはデフォルト値をセットする必要があります(デフォルト値が明確に定義されていない場合はゼロ)。

データセットのデータ構造(StorageInfoデータセットの例)

フィールド順フィールドサイズ
[bytes]
データ型
1StorageType2UINT16
2FilesystemType2UINT16
3AccessCapability2UINT16
4MaxCapacity8UINT64
5FreeSpaceInBytes8UINT64
6FreeSpaceInImages4UINT32
7StorageDescription可変長文字列
8VolumeLabel可変長文字列

DeviceInfoデータセット
StorageInfoデータセット
ObjectInfoデータセット
Eventデータセット
DevicePropDescデータセット

▼ Property
記事情報
datePublished2011-01-01
dateModified2018-08-28
authorアセンブラの魔女
headlinePTPのデータ型についての説明記事です
keywordsPTP
keywordsデータ型
keywords整数型
keywordsハンドル型
keywords文字列型
keywords日付文字列型
keywords配列型
keywordsデータコード
keywords特殊用途のデータ型
keywordsデータセット
publisher name= wiredFish, logo.name= wiredFish, logo.url= https://books-nekoya.jp/Programming/chigu-hagu-title-01.png size= 208 pixel x 50 pixel
image.url url= https://books-nekoya.jp/Programming/chigu-hagu-title-01.png , size= 208 pixel x 50 pixel