Skip to content

Instantly share code, notes, and snippets.

@rockstar2046
Created April 1, 2014 17:01
Show Gist options
  • Save rockstar2046/9918364 to your computer and use it in GitHub Desktop.
Save rockstar2046/9918364 to your computer and use it in GitHub Desktop.
hexdump tool, like linux "xxd" command.
/**
* @fileOverview Hexdump util
* @author ra <ra@rockagen.com>
* @version 0.0.1
* @see {@link http://usejsdoc.org|jsdoc}
* @example
* var stuff="30313233343536";// "0123456"
* var retval=hexdump.pretty(hexdump.decode(stuff));
* console.log(retval);
*
* //output
*
* +-------------------------------------------------+
* | 0 1 2 3 4 5 6 7 8 9 A B C D E F |
* +--------+-------------------------------------------------+----------------+
* |00000000| 30 31 32 33 34 35 36 |0123453 |
* +--------+-------------------------------------------------+----------------+
*
* //enjoy :)
*
*/
/**
*@namespace hexdump
*/
(function(exports){
/**
* Hex array
* @const
*/
exports.HEXARRAY="0123456789ABCDEF".split("");
/**
* Hex string decode to bytes
* @param {String} hex
* @return {Array} bytes
*/
exports.decode=function(hex){
var bytes=[];
for( var i=0;i<hex.length;i+=2 ){
bytes.push(parseInt(hex.substr(i, 2), 16));
}
return bytes;
};
/**
* Get bytes
* @param {String} str
* @return {Array} bytes
*/
exports.bin=function(str){
var bytes=[];
for(var i=0;i<str.length;i++){
bytes.push(str.charCodeAt(i));
}
return bytes;
};
/**
* Compact hex dump
* @param {Array} bytes
* @return {String} hex
*/
exports.compact=function(bytes){
if(bytes === undefined)
return "[no data]";
var length=bytes.length;
var temp;
var hex =new Array(length * 2);
for(var i=0;i<length; ++i){
//UnsignedByte
temp=bytes[i] & 0xFF;
hex[i*2] = exports.HEXARRAY[temp >>> 4];
hex[i*2 +1] = exports.HEXARRAY[temp & 0xFF];
}
return hex.join('');
};
/**
* Pretty hex dump
* @param {Array} bytes
* @return {String} pretty dump
*/
exports.pretty=function(bytes){
if(bytes === undefined)
return "[no data]";
var length=bytes.length;
var row=Math.ceil(length / 16.0);
var newline="\n";
var dump=newline;
dump+=" +-------------------------------------------------+";
dump+=newline;
dump+=" | 0 1 2 3 4 5 6 7 8 9 A B C D E F |";
dump+=newline;
dump+="+--------+-------------------------------------------------+----------------+";
var hex, value, temp;
for(var i=0;i<row;i++){
var ridx=i *16;
hex=Array.apply(null, new Array(49)).map(String.prototype.valueOf, ' ');
value=Array.apply(null, new Array(16)).map(String.prototype.valueOf, ' ');
for(var j=0;j<16;j++){
if (ridx + j >= length)
break;
temp = bytes[ridx + j];
// UnsignedByte
temp = temp & 0xFF;
hex[j * 3 + 1] = exports.HEXARRAY[temp >>> 4];
hex[j * 3 + 2] = exports.HEXARRAY[temp & 0x0F];
if (temp <= 0x1f || temp >= 0x7f) {
value[j] = '.';
} else {
value[j] =String.fromCharCode(temp);
}
}
var offset0=ridx.toString(16);
dump+=newline;
dump+="|";
dump+=Array.apply(null, new Array(8-offset0.length)).map(String.prototype.valueOf, '0').join('');
dump+=offset0; // hex offset
dump+="|";
dump+=hex.join(''); // hex
dump+="|";
dump+=value.join(''); // value
dump+="|";
}
dump+=newline;
dump+="+--------+-------------------------------------------------+----------------+";
dump+=newline;
return dump;
};
})(typeof exports === 'undefined'?this.hexdump={}:exports);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment