git-subtree-dir: third_party/flatbuffers git-subtree-split: 595bf0007ab1929570c7671f091313c8fc20644e
		
			
				
	
	
		
			102 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# Annotated Flatbuffer Binary
 | 
						|
 | 
						|
This directory demonstrates the ability of flatc to annotate binary flatbuffers 
 | 
						|
with helpful annotations. The resulting annotated flatbuffer binary (afb)
 | 
						|
contains all the binary data with line-by-line annotations.
 | 
						|
 | 
						|
## Usage
 | 
						|
 | 
						|
Given a `schema` in either plain-text (.fbs) or already compiled to a binary
 | 
						|
schema (.bfbs) and `binary` file(s) that was created by the `schema`.
 | 
						|
 | 
						|
```sh
 | 
						|
flatc --annotate {schema_file} -- {binary_file}...
 | 
						|
```
 | 
						|
 | 
						|
### Example
 | 
						|
 | 
						|
The following command should produce `annotated_binary.afb` in this directory:
 | 
						|
 | 
						|
```sh
 | 
						|
cd tests\annotated_binary
 | 
						|
..\..\flatc --annotate annotated_binary.fbs -- annotated_binary.bin
 | 
						|
```
 | 
						|
 | 
						|
The `annotated_binary.bin` is the flatbufer binary of the data contained within
 | 
						|
 `annotated_binary.json`, which was made by the following command:
 | 
						|
 | 
						|
```sh
 | 
						|
..\..\flatc -b annotated_binary.fbs annotated_binary.json
 | 
						|
```
 | 
						|
 | 
						|
## Text Format
 | 
						|
 | 
						|
Currently there is a built-in text-based format for outputting the annotations.
 | 
						|
The `annotated_binary.afb` is an example of the text format of a binary
 | 
						|
`annotated_binary.bin` and the `annotated_binary.fbs` (or 
 | 
						|
`annotated_binary.bfbs`) schema.
 | 
						|
 | 
						|
The file is ordered in increasing the offsets from the beginning of the binary.
 | 
						|
The offset is the 1st column, expressed in hexadecimal format (e.g. `+0x003c`).
 | 
						|
 | 
						|
### Binary Sections
 | 
						|
 | 
						|
Binary sections are comprised of contigious [binary regions](#binary-regions) 
 | 
						|
that are logically grouped together. For example, a binary section may be a
 | 
						|
single instance of a flatbuffer `Table` or its `vtable`. The sections may be 
 | 
						|
labelled with the name of the associated type, as defined in the input schema.
 | 
						|
 | 
						|
Example of a `vtable` Binary Section that is associated with the user-defined
 | 
						|
`AnnotateBinary.Bar` table.
 | 
						|
 | 
						|
```
 | 
						|
vtable (AnnotatedBinary.Bar):
 | 
						|
  +0x00A0 | 08 00                   | uint16_t   | 0x0008 (8)                         | size of this vtable
 | 
						|
  +0x00A2 | 13 00                   | uint16_t   | 0x0013 (19)                        | size of referring table
 | 
						|
  +0x00A4 | 08 00                   | VOffset16  | 0x0008 (8)                         | offset to field `a` (id: 0)
 | 
						|
  +0x00A6 | 04 00                   | VOffset16  | 0x0004 (4)                         | offset to field `b` (id: 1)
 | 
						|
```
 | 
						|
 | 
						|
### Binary Regions
 | 
						|
 | 
						|
Binary regions are contigious bytes regions that are grouped together to form 
 | 
						|
some sort of value, e.g. a `scalar` or an array of scalars. A binary region may
 | 
						|
be split up over multiple text lines, if the size of the region is large.
 | 
						|
 | 
						|
Looking at an example binary region:
 | 
						|
 | 
						|
```
 | 
						|
vtable (AnnotatedBinary.Bar):
 | 
						|
  +0x00A0 | 08 00                   | uint16_t   | 0x0008 (8)                         | size of this vtable
 | 
						|
```
 | 
						|
 | 
						|
The first column (`+0x00A0`) is the offset to this region from the beginning of
 | 
						|
the buffer. 
 | 
						|
 | 
						|
The second column are the raw bytes (hexadecimal) that make up this
 | 
						|
region. These are expressed in the little-endian format that flatbuffers uses 
 | 
						|
for the wire format.
 | 
						|
 | 
						|
The third column is the type to interpret the bytes as. Some types are special
 | 
						|
to flatbuffer internals (e.g. `SOffet32`, `Offset32`, and `VOffset16`) which are
 | 
						|
used by flatbuffers to point to various offsetes. The other types are specified
 | 
						|
as C++-like types which are the standard fix-width scalars. For the above
 | 
						|
example, the type is `uint16_t` which is a 16-bit unsigned integer type.
 | 
						|
 | 
						|
The fourth column shows the raw bytes as a compacted, big-endian value. The raw
 | 
						|
bytes are duplicated in this fashion since it is more intutive to read the data
 | 
						|
in the big-endian format (e.g., `0x0008`). This value is followed by the decimal
 | 
						|
representation of the value (e.g., `(8)`). (For strings, the raw string value
 | 
						|
is shown instead). 
 | 
						|
 | 
						|
The fifth column is a textual comment on what the value is. As much metadata as
 | 
						|
known is provided.
 | 
						|
 | 
						|
#### Offsets
 | 
						|
 | 
						|
If the type in the 3rd column is of an absolute offset (`SOffet32` or 
 | 
						|
`Offset32`), the fourth column also shows an `Loc: +0x025A` value which shows 
 | 
						|
where in the binary this region is pointing to. These values are absolute from
 | 
						|
the beginning of the file, their calculation from the raw value in the 4th
 | 
						|
column depends on the context.
 |