+(function () {
+
+ var repeat = function (times, str) {
+ var ret = "";
+
+ for (var i = 0; i < times; i++) {
+ ret += str;
+ }
+
+ return ret;
+ };
+
+ var printHex = function (width, num) {
+ var ret = Number(num).toString(16);
+
+ if (ret.length < width) {
+ return repeat(width - ret.length, "0") + ret;
+ }
+ else {
+ return ret;
+ }
+ };
+
+ var isPrintableAscii = function (code) {
+ return (code >= 0x20 && code <= 0x7e);
+ };
+
+ Rakka.hexDump = function (data, limit) {
+ var offset = 0;
+ var size = Math.min(data.length, limit);
+ var ret = "";
+
+ for (; offset < size; offset += 16) {
+ ret += printHex(8, offset);
+ ret += " ";
+
+ var begin = offset;
+ var end = Math.min(offset + 16, size);
+
+ for (var i = begin; i < end; i++) {
+ var c = data.charCodeAt(i);
+
+ ret += printHex(2, c);
+ ret += " ";
+
+ if (end - i == 9) {
+ ret += " ";
+ }
+ }
+ for (var i = end; i < offset + 16; i++) {
+ ret += " ";
+ if (end - i == 9) {
+ ret += " ";
+ }
+ }
+
+ ret += " |";
+
+ for (var i = begin; i < end; i++) {
+ var c = data.charCodeAt(i);
+
+ if (isPrintableAscii(c)) {
+ ret += data.charAt(i);
+ }
+ else {
+ ret += ".";
+ }
+ }
+ ret += "|";
+ for (var i = end; i < offset + 16; i++) {
+ ret += " ";
+ }
+
+ ret += "\n";
+ }
+
+ if (data.length > limit) {
+ ret += printHex(8, offset);
+ ret += " ...\n";
+ }
+
+ return ret;
+ };
+
+ })();
\ No newline at end of file