Open In App

xxd Command in Linux

Last Updated : 26 Apr, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report

xxd is a command-line tool that is primarily used for creating and analyzing hexadecimal dumps from files. It can also be used to reverse the process and convert a hexadecimal dump back into binary form. In this article, let's uncover the practical applications of the "xxd" command in the Linux ecosystem.

What is a 'hexadecimal dump'?

A hexadecimal dump, often called a hex dump, is a representation of binary data in a human-readable format using hexadecimal notation. Each byte of binary data is displayed as a pair of hexadecimal digits, making it easier to understand the data.

Here's an example of the phrase "How are you" in a hexadecimal dump:

486f 7720 6172 6520 796f 750a            How are you.

Here, "48" represents 'H,' "6f" represents 'o,' and so on.

Installing xxd on Linux

While most Linux distributions come with the "xxd" command pre-installed, if you encounter an error when attempting to use it, you may need to install it based on your specific distribution.

Red hat/ Fedora based:

sudo dnf install xxd
Screenshot-2023-11-01-055850
Installing xxd in Fedora

Debian/Ubuntu based:

sudo apt install xxd

Using xxd command:

Syntax:

xxd [options] [file path]

Options available in xxd command

Here's a table that summarizes some of the most common options of the "xxd" command and their descriptions:

Options

Description

-l

Limit the number of bytes processed or displayed.

-g

Set the number of bytes per group in the output.

-c

Set the number of bytes per line in the output.

-s

Skip a specified number of bytes before processing.

-b

Generate a binary digit dump

-u

Generate includedincluded uppercase hex-dump

-ps

Output in postscript continuous hex-dump style.

-i

Generate a C-included left file with binary data as an array.

-r

Reverse the process by converting a hexadecimal dump back into binary.

-v

Display the version information of "xxd."

Generating hexadecimal dumps

To create a hexadecimal dump of a file, you can use the following command:

xxd [file path]

The binary output on the left side represents a hexadecimal memory address or offset, which indicates the position of each line's data in memory or a binary file, then there are two columns:

  • The leftThe right column contains the hexadecimal representation of the binary data.
  • The right, column shows the ASCII representation.
Screenshot-2023-11-01-061015
Output: xxd hello.txt

Here we can see, that the hexadecimal representation for 'H' is 48, for 'e' it is 65, the and so on.

Note: Hexadecimal '0a' is a line feed character and is marking the end of the text file.

Storing hexadecimal dump in a file

We can store the generated hexadecimal dump using the redirection operator '>', type the following command:

xxd [file path] > [output file path]
Screenshot-2023-11-01-062254
Storing hexadecimal dump in a file

Here, the hexadecimal dump from standard output is stored in a file named hexdump.txt using the the redirection operator.

Converting hexadecimal dump to the original file

xxd -r [hexadecimal dump file path]
Screenshot-2023-11-01-065455
Converting hexadecimal dump to the original file

The hexadecimal dump was saved in a file called "hexdump.txt," and we used the '-r' option to reverse this process, converting the hex dump back into its original format. The resulting data has been stored in a file named "reversed.txt."

Formatting output of xxd

Skipping n bytes from start (-s offset)

The xxd command allows you to specify an offset, effectively skipping a certain number of lines or bytes in the input file when generating a hexadecimal dump.

xxd -s [offset] [file path]
Screenshot-2023-11-01-063354
Skipping 5 bytes of 'Hello'


Here, xxd skipped 5 bytes of the word 'Hello' and generated a hexadecimal dump for the remaining text.

Display last n bytes (-s -offset)

The "xxd -s" option allows you to specify an offset or skip a certain number of bytes at the beginning of a file when generating a hexadecimal dump.

xxd -s -[number of bytes] [file path]
Screenshot-2023-11-01-063841
Hexdump of last 5 bytes 'ine!.'

By using the '-' operator in the offset, the resulting hexadecimal dump is generated for the last 5 bytes of the file.

Display first n bytes (-l)

The "xxd -l" option permits you to limit the number of bytes processed or displayed when generating a hexadecimal dump.

xxd -l [number of bytes] [file path]
Screenshot-2023-11-01-072725
Displaying the first 20 bytes

We are generating a hex dump of the the first 20 bytes (0x14 is hexadecimal equivalent of 20).

Skipping n output lines

Here's another example where we skip lines in the hexadecimal dump by specifying offsets like 0x10 (which is equivalent to 16 in decimal) and 0x20 (equivalent to 32 in decimal). It's the same as skipping bytes, we are just omitting the display of 16 bytes of data per skipped line.

Screenshot-2023-11-01-071806
Skipped 1 output line

Number of octets (grouped bytes) per group (-g)

The -g option allows us to organize the output by grouping a certain number of bytes.

xxd -g [number of octets] [file path]
Screenshot-2023-11-01-083852
Hexdump of 4 bytes per group

Here, we have generated a hexadecimal dump with 4 bytes per group.

Limiting the number of columns (-c)

We can use the -c option to limit the number of columns per line in the output dump.

xxd -c [number of columns] [file path]
Screenshot-2023-11-01-074412
Output of 5 columns per line

Here, we are limiting the output to 5 columns per line, you can use 0x05 instead of 5 to get the same output.

Note: Other than using hexadecimal as input for options, you can use other formats like decimal and octal too.

For example: To display the first 20 bytes of the file the commands can be:

Screenshot-2023-11-01-072154

Here, the number of bytes is 20 in decimal, 0x14 in hexadecimal, and 024 in octal.

Different dump output styles

Binary digit dump (-b)

Instead of generating a hexadecimal dump, the use of the "-b" option allows us to create a dump that represents the binary digits of the data.

 xxd -b [file path]
Screenshot-2023-11-01-074811
Binary digit dump of hello.txt

The above binary dump, generated using the -b option, shows that the character 'H' is converted to the binary sequence '01001000', the character 'e' is converted to the binary sequence '01100101', and so on.

Plain hexadecimal dump (-ps)

The "xxd -ps" option is used to generate a hexadecimal postscript-style dump, also known as plain hexdump style. It provides a specific output format where the bytes are displayed continuously without line breaks, suitable for certain applications or requirements.

xxd -ps [file path]
Screenshot-2023-11-01-075201
Plain hexadecimal dump

Uppercase hexadecimal dump (-u)

The "xxd -u" option in the xxd command is used to specify that the hexadecimal output should use uppercase characters instead of the default lowercase characters.

Screenshot-2023-11-01-075718
Hexadecimal dump in uppercase

Embedding Binary Data in C/C++ Code (xxd -i)

While the primary purpose of xxd is to create hexadecimal dumps, xxd -i takes it a step further by generating a C include file that contains the binary data as an array.

xxd -i [input file] > [output.c]

The generated output.c file includes an array with the binary data from hello.txt. For example, you might get something like this in output.c:

Screenshot-2023-11-01-081723
Output: xxd -i hello.txt
  • unsigned char hello_txt[] is an array of unsigned characters, which represents the binary data of hello.txt.
  • The array is initialized with a list of hexadecimal values enclosed within curly braces. Each hexadecimal value represents a byte of data, with the 0x prefix denoting a hexadecimal number. The values correspond to the ASCII codes of the characters in "hello.txt."
  • unsigned int hello_txt_len is an additional variable that stores the length of the array. In this case, it's set to 30, indicating that the array contains 30 bytes of data.

Now, you can easily use this array in your C or C++ code, making it convenient for embedding binary data, such as images or other resources, directly into your applications.

C program to utilize the output of xxd -i:

You can use the generated C code to display the text from hello.txt as follows:

C
#include <stdio.h>

// The generated data
unsigned char hello_txt[]
    = { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x68,
        0x6f, 0x77, 0x20, 0x61, 0x72, 0x65, 0x20, 0x79,
        0x6f, 0x75, 0x3f, 0x0a, 0x49, 0x27, 0x6d, 0x20,
        0x66, 0x69, 0x6e, 0x65, 0x21, 0x0a };

unsigned int hello_txt_len = 30;

int main()
{
    // Print the content of hello.txt
    for (unsigned int i = 0; i < hello_txt_len; i++) {
        putchar(hello_txt[i]);
    }

    return 0;
}

Output
Hello, how are you?
I'm fine!

This C code includes the generated data array hello_txt and its length hello_txt_len. The program iterates through the array and uses the putchar function to display the data, printing the original content of "hello.txt."

Conclusion

The "xxd" command in Linux is a versatile tool that allows users to work with binary data easily. Whether you need to analyze binary files, edit them with a text editor, or convert between hexadecimal dumps and binary data, "xxd" provides a valuable solution. Understanding and utilizing this command can be a significant asset for anyone dealing with binary data in the Linux environment.


Next Article

Similar Reads