}
int usage_data_printdemodbuf(){
- PrintAndLog("Usage: data printdemodbuffer x o <offset>");
+ PrintAndLog("Usage: data printdemodbuffer x o <offset> l <length>");
PrintAndLog("Options: ");
PrintAndLog(" h This help");
PrintAndLog(" x output in hex (omit for binary output)");
PrintAndLog(" o <offset> enter offset in # of bits");
+ PrintAndLog(" l <length> enter length to print in # of bits or hex characters respectively");
return 0;
}
char hex[512]={0x00};
bool hexMode = false;
bool errors = false;
- uint8_t offset = 0;
+ uint32_t offset = 0; //could be size_t but no param_get16...
+ uint32_t length = 512;
char cmdp = 0;
while(param_getchar(Cmd, cmdp) != 0x00)
{
break;
case 'o':
case 'O':
- offset = param_get8(Cmd, cmdp+1);
+ offset = param_get32ex(Cmd, cmdp+1, 0, 10);
if (!offset) errors = true;
cmdp += 2;
break;
+ case 'l':
+ case 'L':
+ length = param_get32ex(Cmd, cmdp+1, 512, 10);
+ if (!length) errors = true;
+ cmdp += 2;
+ break;
default:
PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
errors = true;
}
//Validations
if(errors) return usage_data_printdemodbuf();
-
- int numBits = (DemodBufferLen-offset) & 0x7FC; //make sure we don't exceed our string
+ length = (length > (DemodBufferLen-offset)) ? DemodBufferLen-offset : length;
+ int numBits = (length) & 0x00FFC; //make sure we don't exceed our string
if (hexMode){
char *buf = (char *) (DemodBuffer + offset);
+ numBits = (numBits > sizeof(hex)) ? sizeof(hex) : numBits;
numBits = binarraytohex(hex, buf, numBits);
if (numBits==0) return 0;
PrintAndLog("DemodBuffer: %s",hex);
char amp = param_getchar(Cmd, 0);
uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
sscanf(Cmd, "%i %i %i %i %c", &clk, &invert, &maxErr, &maxLen, &);
- if (!maxLen) maxLen = 512*64;
+ if (!maxLen) maxLen = BIGBUF_SIZE;
if (invert != 0 && invert != 1) {
PrintAndLog("Invalid argument: %s", Cmd);
return 0;
{"manrawdecode", Cmdmandecoderaw, 1, "[invert] [maxErr] -- Manchester decode binary stream in DemodBuffer"},
{"norm", CmdNorm, 1, "Normalize max/min to +/-128"},
{"plot", CmdPlot, 1, "Show graph window (hit 'h' in window for keystroke help)"},
- {"printdemodbuffer",CmdPrintDemodBuff, 1, "[x] [o] <offset> -- print the data in the DemodBuffer - 'x' for hex output"},
+ {"printdemodbuffer",CmdPrintDemodBuff, 1, "[x] [o] <offset> [l] <length> -- print the data in the DemodBuffer - 'x' for hex output"},
{"pskindalademod", CmdIndalaDecode, 1, "[clock] [invert<0|1>] -- Demodulate an indala tag (PSK1) from GraphBuffer (args optional)"},
{"psknexwatchdemod",CmdPSKNexWatch, 1, "Demodulate a NexWatch tag (nexkey, quadrakey) (PSK1) from GraphBuffer"},
{"rawdemod", CmdRawDemod, 1, "[modulation] ... <options> -see help (h option) -- Demodulate the data in the GraphBuffer and output binary"},
//-----------------------------------------------------------------------------
#include "util.h"
+#define MAX_BIN_BREAK_LENGTH (3072+384+1)
#ifndef _WIN32
#include <termios.h>
#include <sys/ioctl.h>
+
int ukbhit(void)
{
int cnt = 0;
}
char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t breaks) {
-
- int maxLen = ( len > 1020) ? 1020 : len;
- static char buf[1024];
- memset(buf, 0x00, 1024);
+ // make sure we don't go beyond our char array memory
+ int max_len = ( len+(len/breaks) > MAX_BIN_BREAK_LENGTH ) ? MAX_BIN_BREAK_LENGTH : len+(len/breaks);
+ static char buf[MAX_BIN_BREAK_LENGTH]; // 3072 + end of line characters if broken at 8 bits
+ //clear memory
+ memset(buf, 0x00, sizeof(buf));
char *tmp = buf;
- for (size_t i=0; i < maxLen; ++i){
- sprintf(tmp++, "%u", data[i]);
- if (breaks > 0 && !((i+1) % breaks))
+ size_t in_index = 0;
+ // loop through the out_index to make sure we don't go too far
+ for (size_t out_index=0; out_index < max_len; out_index++) {
+ // set character
+ sprintf(tmp++, "%u", data[in_index]);
+ // check if a line break is needed
+ if ( (breaks > 0) && !((in_index+1) % breaks) && (out_index+1 != max_len) ) {
+ // increment and print line break
+ out_index++;
sprintf(tmp++, "%s","\n");
+ }
+ in_index++;
}
return buf;