#include #include #include #include #include #include using namespace std; struct buf { static const int size = 128; buf() { memset(bytes, 0, size); } bool valid_offset(int o) { return (0 <= o && o < size); } void set_c(char c, int offset) { if (valid_offset(offset)) bytes[offset] = c; } void set_s(const char *s, int offset) { for (int i = 0; i < strlen(s)+1; i++){ set_c(s[i], offset+i); } } void set_i(int i, int offset) { union {int x; char s[5] = {0};}; x = i; set_s(s, offset); } void print() { for(auto b : bytes) { cout << setw(2) << setfill('0') << hex << uppercase << ((unsigned int)b & 0xff); } cout << endl; } char bytes[size]; }; struct arg { enum type_t{ a_u,a_s,a_x,a_c } _type; int offset; union { int i;char*s;char c; } data; static type_t cast_type(char c) { if (c == 'u') return a_u; if (c == 'x') return a_x; if (c == 's') return a_s; if (c == 'c') return a_c; } void type(type_t t) { _type = t; if (t == a_s) { data.s = new char[512]; } } void type(char c) { type(cast_type(c)); } type_t type() {return _type;} void* get() { if (type() == a_s) return data.s; else return &data.i; } }; void read_args(string str, string fmt, vector &varg) { void *args[100] = {0}; int i = 0; for (arg &a :varg) { args[i++] = a.get(); } //TODO: template this or fake va_list int argc = 99; sscanf(str.c_str(), fmt.c_str() ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ,args[argc--],args[argc--],args[argc--],args[argc--],args[argc--] ); } vector extract_args(string str) { vector varg; istringstream istr; istr.str(str); int idx = 0; while (!istr.eof()) { char c; istr >> c; if (c == '%') { arg a; istr >> c; a.type(c); varg.push_back(a); } else if (c == ',') { int n; istr >> n; varg[idx++].offset = n; } } return varg; } string extract_fmt(string &str) { return str.substr(0, str.find(',')); } string stdin_readline() { char a[512]; cin.getline(a, 512); return string(a); } int main() { string desc, str; desc = stdin_readline(); str = stdin_readline(); auto varg = extract_args(desc); string fmt = extract_fmt(desc); read_args(str, fmt, varg); buf buffer; for (arg &a : varg) { if (a.type() == arg::a_c) buffer.set_c(a.data.c, a.offset); else if (a.type() == arg::a_s) buffer.set_s(a.data.s, a.offset); else if (a.type() == arg::a_u || a.type() == arg::a_x) buffer.set_i(a.data.i, a.offset); } buffer.print(); return 0; }