PTPでは次のような汎用データ型(Simple Types)が定義されています。オペレーションによっては、転送データを特定のデータ型に限定せず自由度を高めている場合もあります。このような場合には、転送データがどのようなデータ型であるか示すために、それぞれの基本データ型にはデータタイプ コード(Datatype code)が定義されています。
データタイプ コード | データ型 | 説明 |
---|---|---|
0x0000 | UNDEF | 未定義 |
0x0001 | INT8 | 符号付き整数8ビット |
0x0002 | UINT8 | 符号無し整数8ビット |
0x0003 | INT16 | 符号付き整数16ビット |
0x0004 | UINT16 | 符号無し整数16ビット |
0x0005 | INT32 | 符号付き整数32ビット |
0x0006 | UINT32 | 符号無し整数32ビット |
0x0007 | INT64 | 符号付き整数64ビット |
0x0008 | UINT64 | 符号無し整数64ビット |
0x0009 | INT64 | 符号付き整数128ビット |
0x000A | UINT128 | 符号無し整数128ビット |
0x4001 | AINT8 | 符号付き整数8ビットの配列 |
0x4002 | AUINT8 | 符号無し整数8ビットの配列 |
0x4003 | AINT16 | 符号付き整数16ビットの配列 |
0x4004 | AUINT16 | 符号無し整数16ビットの配列 |
0x4005 | AINT32 | 符号付き整数32ビットの配列 |
0x4006 | AUINT32 | 符号無し整数32ビットの配列 |
0x4007 | AINT64 | 符号付き整数64ビットの配列 |
0x4008 | AUINT64 | 符号無し整数64ビットの配列 |
0x4009 | AINT128 | 符号付き整数128ビットの配列 |
0x400A | AUINT128 | 符号無し整数128ビットの配列 |
0xFFFF | STR | 可変長のUnicode文字列 |
その他のコード | Undefined | Reserved |
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] | データ型 |
---|---|---|---|
0 | NumChars | 1 | UINT8 |
1 | StringChars | 可変長 | NULLで終端されたUnicode文字列 |
空の文字列の場合、値ゼロのNumCharsフィールドのみが存在し、StringCharsフィールドは存在しません。
日付文字列型(DateTime String)は日付や時刻を表すために用いられます。データ型は文字列型と同じですが、書式はISO 8601互換の"YYYYMMDDThhmmss.s"形式となります。
書式
フィールド | 意味 |
---|---|
YYYY | 年(4桁の数字) |
MM | 月(01~12) |
DD | 日(01~31) |
T | 常に'T'をセット |
hh | 時(00~23) |
mm | 分(00~59) |
ss | 秒(00~59) |
.s | 1/10秒(オプション) |
文字列の最後には協定世界時(UTC)であることを示すための'Z'を追加することができます。
例
文字列の最後に"+hhmm"または"-hhmm"を追加することで、そのタイムゾーンでのローカル時刻を示すことができます。
例
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] |
---|---|---|
0 | NumElements(UINT32型) | 4 |
1 | 配列要素[0] | ElementSize |
1+ElementSize | 配列要素[1] | ElementSize |
: | ||
1+ElementSize*(NumElements-1) | 配列要素[NumElements-1] | ElementSize |
空の配列の場合、値ゼロのNumElementsフィールドのみが存在します。
「データコード」(Datacodes)という言葉はPTPでは特別な意味を持ちます。データコードは符号無し16ビット整数(UINT16)型で上位4ビットがデータタイプを示すためのフィールドとして割り当てられています。オペレーション コードなど、PTPで頻繁に用いられるデータの多くはデータコードで表現されます。
Bit15 | Bit14 | Bit13 | Bit12 | Bit10-0 | コード タイプ |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | コード値 | Undefined |
0 | 0 | 1 | 標準オペレーションコード(OperationCode) | ||
0 | 1 | 0 | 標準レスポンスコード(ResponseCode) | ||
0 | 1 | 1 | 標準オブジェクトフォーマットコード(ObjectFormatCode) | ||
1 | 0 | 0 | 標準イベントコード(EventCode) | ||
1 | 0 | 1 | 標準デバイスプロパティコード(DevicePropCode) | ||
1 | 1 | 0 | Reserved | ||
1 | 1 | 1 | Reserved | ||
1 | 0 | 0 | 0 | Undefined | |
0 | 0 | 1 | ベンダー拡張オペレーションコード(OperationCode) | ||
0 | 1 | 0 | ベンダー拡張レスポンスコード(ResponseCode) | ||
0 | 1 | 1 | ベンダー拡張オブジェクトフォーマットコード(ObjectFormatCode) | ||
1 | 0 | 0 | ベンダー拡張イベントコード(EventCode) | ||
1 | 0 | 1 | ベンダー拡張デバイスプロパティコード(DevicePropCode) | ||
1 | 1 | 0 | Reserved | ||
1 | 1 | 1 | Reserved |
最上位ビット(bit15)が1のコードは、ベンダー拡張されたコードであることを意味します。
PTPでは次のような特定用途のためのデータ型も定義されています。
型 | サイズ [bytes] | フォーマット |
---|---|---|
OperationCode(オペレーションコード) | 2 | データコード (UINT16) |
ResponseCode(レスポンスコード) | 2 | データコード (UINT16) |
EventCode(イベントコード) | 2 | データコード UINT16) |
DevicePropCode(デバイスプロパティコード) | 2 | データコード (UINT16) |
ObjectFormatCode(オブジェクトフォーマットコード) | 2 | データコード (UINT16) |
StorageID(ストレージID) | 4 | UINT32 |
ObjectHandle(オブジェクトハンドル) | 4 | UINT32 |
DeviceInfo | 可変長 | データセット |
StorageInfo | 可変長 | データセット |
ObjectInfo | 可変長 | データセット |
DevicePropDesc | 可変長 | データセット |
DevicePropDescEnum | 可変長 | 列挙形式のDevicePropDesc |
DevicePropDescRange | 可変長 | 範囲表示形式のDevicePropDesc |
「データセット」(Datasets)とは、互いに関連するデータの集合体でUSBのディスクリプタのような役割やデータ構造を持つデータです。単純な構造の数バイトのデータなら、オペレーションやレスポンスのパラメータを使ってやり取りすることができますが、PTPで定義される複雑で規模の大きなデータはデータセットを使ってトランザクション フェーズのデータフェーズで転送されます。
データセット中の使わないフィールドにはデフォルト値をセットする必要があります(デフォルト値が明確に定義されていない場合はゼロ)。
データセットのデータ構造(StorageInfoデータセットの例)
フィールド順 | フィールド | サイズ [bytes] | データ型 |
---|---|---|---|
1 | StorageType | 2 | UINT16 |
2 | FilesystemType | 2 | UINT16 |
3 | AccessCapability | 2 | UINT16 |
4 | MaxCapacity | 8 | UINT64 |
5 | FreeSpaceInBytes | 8 | UINT64 |
6 | FreeSpaceInImages | 4 | UINT32 |
7 | StorageDescription | 可変長 | 文字列 |
8 | VolumeLabel | 可変長 | 文字列 |
DeviceInfoデータセット
StorageInfoデータセット
ObjectInfoデータセット
Eventデータセット
DevicePropDescデータセット