2020-06-08 03:29:51 +03:00
# fq
2022-01-15 21:26:45 +03:00
Tool, language and decoders for working with binary data.
2020-06-08 03:29:51 +03:00
2021-10-10 03:17:29 +03:00
![fq demo ](doc/demo.svg )
2020-06-08 03:29:51 +03:00
2021-11-29 15:34:45 +03:00
In most cases fq works the same way as jq but instead of reading JSON it reads binary data.
2022-01-15 21:26:45 +03:00
The result is a JSON compatible structure where values have a bit range, can have symbolic
values and know how to be presented in a useful ways.
2021-11-22 16:16:59 +03:00
2022-01-15 21:26:45 +03:00
It was initially developed to debug, inspect and query media files but has since been extended
to handle a variety of binary formats.
2021-12-29 01:13:23 +03:00
2022-01-15 21:26:45 +03:00
You can pronounce the name as you wish, I pronounce jq /‘ dʒei’ kju:/ so I usually pronounce fq /‘ ef’ kju:/.
2021-11-22 16:16:59 +03:00
2022-01-15 21:26:45 +03:00
**NOTE:** fq is still early in development so some things are broken or do not make sense.
That also means that there is a great opportunity to help out!
### Goals
2021-09-18 20:27:46 +03:00
2021-11-03 13:02:45 +03:00
- Make binary formats accessible and queryable.
2021-09-19 01:51:15 +03:00
- Nested formats and bit-oriented decoding.
2021-10-31 17:25:45 +03:00
- Quick and comfortable CLI tool.
2022-01-15 21:26:45 +03:00
- Bits and bytes transformations.
2021-09-18 20:27:46 +03:00
2022-01-15 21:26:45 +03:00
### Hopes
2021-12-29 01:13:23 +03:00
- Make it useful enough that people want to help improve it.
- Inspire people to create similar tools.
2021-11-03 13:02:45 +03:00
## Usage
2021-12-20 17:15:43 +03:00
Basic usage is `fq . file` .
2021-11-17 12:20:51 +03:00
2022-01-15 21:26:45 +03:00
For more details see [usage.md ](doc/usage.md )
2021-11-03 13:02:45 +03:00
2020-06-08 03:29:51 +03:00
## Install
2021-12-20 17:15:43 +03:00
Download [release ](https://github.com/wader/fq/releases ) for your
2021-11-29 15:34:45 +03:00
platform, unarchive it and move the executable to `PATH` etc.
2020-06-08 03:29:51 +03:00
### Homebrew
```sh
# install latest release
brew install wader/tap/fq
```
2021-12-24 00:57:25 +03:00
### Arch Linux
2021-12-29 14:26:32 +03:00
`fq` can be installed from the [community repository ](https://archlinux.org/packages/community/x86_64/fq/ ) using [pacman ](https://wiki.archlinux.org/title/Pacman ):
2021-12-24 00:57:25 +03:00
```sh
2021-12-29 13:10:57 +03:00
pacman -S fq
2021-12-24 00:57:25 +03:00
```
2021-12-29 14:26:32 +03:00
You can also build and install the development (VCS) package using an [AUR helper ](https://wiki.archlinux.org/index.php/AUR_helpers ):
```sh
paru -S fq-git
```
2021-12-23 12:44:31 +03:00
### Nix
```sh
nix-shell -p fq
```
2021-12-29 01:13:23 +03:00
### FreeBSD
Use the [fq ](https://cgit.freebsd.org/ports/tree/misc/fq ) port.
2022-01-09 19:02:20 +03:00
### Alpine
Currently in edge testing but should work fine in stable also.
```
apk add -X http://dl-cdn.alpinelinux.org/alpine/edge/testing fq
```
2020-06-08 03:29:51 +03:00
### Build from source
2021-09-19 11:27:56 +03:00
Make sure you have go 1.17 or later installed.
To install directly from git repository do:
2020-06-08 03:29:51 +03:00
```sh
2021-09-19 11:27:56 +03:00
# build and install latest release
2020-06-08 03:29:51 +03:00
go install github.com/wader/fq@latest
2021-10-29 19:46:19 +03:00
2021-09-19 11:27:56 +03:00
# or build and install latest master
go install github.com/wader/fq@master
2021-10-29 19:46:19 +03:00
2021-09-19 11:27:56 +03:00
# copy binary to $PATH if needed
cp "$(go env GOPATH)/bin/fq" /usr/local/bin
```
To build and run tests from source directory:
```sh
make test fq
# copy binary to $PATH if needed
cp fq /usr/local/bin
2022-01-09 19:02:20 +03:00
# it's also possible to use go run
go run fq.go
2020-06-08 03:29:51 +03:00
```
## Supported formats
[./formats_list.jq]: sh-start
2022-01-12 20:35:28 +03:00
aac_frame,
adts,
adts_frame,
apev2,
ar,
av1_ccr,
av1_frame,
av1_obu,
avc_annexb,
avc_au,
avc_dcr,
avc_nalu,
avc_pps,
avc_sei,
avc_sps,
bencode,
bsd_loopback_frame,
bson,
bzip2,
cbor,
dns,
dns_tcp,
elf,
ether8023_frame,
exif,
flac,
flac_frame,
flac_metadatablock,
flac_metadatablocks,
flac_picture,
flac_streaminfo,
gif,
gzip,
hevc_annexb,
hevc_au,
hevc_dcr,
hevc_nalu,
icc_profile,
icmp,
id3v1,
id3v11,
id3v2,
ipv4_packet,
jpeg,
json,
matroska,
mp3,
mp3_frame,
mp4,
mpeg_asc,
mpeg_es,
mpeg_pes,
mpeg_pes_packet,
mpeg_spu,
mpeg_ts,
msgpack,
ogg,
ogg_page,
opus_packet,
pcap,
pcapng,
png,
protobuf,
protobuf_widevine,
pssh_playready,
raw,
sll2_packet,
sll_packet,
tar,
tcp_segment,
tiff,
udp_datagram,
vorbis_comment,
vorbis_packet,
vp8_frame,
vp9_cfm,
vp9_frame,
vpx_ccr,
wav,
webp,
xing,
zip
2020-06-08 03:29:51 +03:00
[#]: sh-end
2021-11-17 12:20:51 +03:00
For details see [formats.md ](doc/formats.md )
2020-06-08 03:29:51 +03:00
## TODO and ideas
2021-11-17 12:20:51 +03:00
See [TODO.md ](doc/TODO.md )
2020-06-08 03:29:51 +03:00
## Development
2021-11-17 12:20:51 +03:00
See [dev.md ](doc/dev.md )
2020-06-08 03:29:51 +03:00
## Thanks and related projects
2021-11-19 02:23:04 +03:00
This project would not have been possible without [itchyny ](https://github.com/itchyny )'s
2021-11-29 15:34:45 +03:00
jq implementation [gojq ](https://github.com/itchyny/gojq ). I also want to thank
2020-06-08 03:29:51 +03:00
[HexFiend ](https://github.com/HexFiend/HexFiend ) for inspiration and ideas and [stedolan ](https://github.com/stedolan )
for inventing the [jq ](https://github.com/stedolan/jq ) language.
2022-01-12 20:28:02 +03:00
### Similar or related projects
2021-12-09 23:09:00 +03:00
- [HexFiend ](https://github.com/HexFiend/HexFiend )
- [binspector ](https://github.com/binspector/binspector )
- [kaitai ](https://kaitai.io )
- [Wireshark ](https://www.wireshark.org ) (specially `tshark -T json` )
- [MediaInfo ](https://mediaarea.net/en/MediaInfo ) (specially `mediainfo --Output=JSON` and `mediainfo --Details=1` )
- [GNU poke ](https://www.jemarch.net/poke )
- [ffmpeg/ffprobe ](https://ffmpeg.org )
- [hexdump ](https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/tree/text-utils/hexdump.c )