1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- 'use strict'
- const { createWriteStream } = require('fs')
- /**
- * @typedef {object} HexDumpParams
- * @property {Buffer} buffer The buffer instance to serialize into a hex dump.
- * @property {string} [prefix=''] A string to prefix each byte with, e.g.
- * `0x`.
- * @property {string} [separator=''] A string to separate each byte with, e.g.
- * `, '.
- * @property {string[]} [wrapCharacters=[]] A set of characters to wrap the
- * output with. For example, `wrapCharacters=['[', ']']` will start the hex
- * dump with `[` and end it with `]`.
- * @property {number} [width=10] How many bytes to write per line.
- * @property {WriteStream | string} [destination=process.stdout] Where to
- * write the serialized data. If a string is provided, it is assumed to be
- * the path to a file. This file will be completely overwritten.
- * @property {boolean} [closeDestination=false] Indicates whether the
- * `destination` should be closed when done. This _should_ be `true` when the
- * passed in `destination` is a stream that you control. If a string path is
- * supplied for the `destination`, this will automatically be handled.
- */
- // We'd like to put this coverage directive after the doc block,
- // but that confuses doc tooling (e.g. WebStorm).
- /* istanbul ignore next: defaults don't need 100% coverage */
- /**
- * Given a buffer of bytes, generate a hex dump that can be loaded later
- * or viewed in a hex editor (e.g. [Hex Fiend](https://hexfiend.com)).
- *
- * @param {HexDumpParams} params
- *
- * @throws When the destination cannot be accessed.
- */
- module.exports = function bufferToHexDump ({
- buffer,
- prefix = '',
- separator = '',
- wrapCharacters = [],
- width = 10,
- destination = process.stdout,
- closeDestination = false
- }) {
- let closeStream = closeDestination
- if (typeof destination === 'string') {
- destination = createWriteStream(destination)
- closeStream = true
- }
- if (wrapCharacters[0]) {
- destination.write(wrapCharacters[0])
- }
- for (const [i, byte] of buffer.entries()) {
- const outByte = Number(byte).toString(16).padStart(2, '0')
- destination.write(prefix + outByte)
- if (i !== buffer.byteLength - 1) {
- destination.write(separator)
- }
- if ((i + 1) % width === 0) {
- destination.write('\n')
- }
- }
- if (wrapCharacters[1]) {
- destination.write(wrapCharacters[1])
- }
- /* istanbul ignore else */
- if (closeStream === true) {
- destination.end()
- }
- }
|