Текст вашего вопроса обратный от вашего названия и примера. Предполагая последнее:
Учитывая шестнадцатеричное представление несжатой формы точки c публикации (или любой другой точки) на кривой простого поля , такой как secp256k1, которая имеет вид Форма, подобная
u = "04xxxxxxxxyyyyyyyy" // with lengths depending on curve's field
, для создания шестнадцатеричного представления сжатой формы сделайте что-то вроде:
int k = strlen(u)/4; // hexit-pairs (value bytes) of each coordinate
// or use known constant for curve e.g. 32 for secp256k1
char * c = malloc (k*2+2+1); // error handling needed but depends on program
memcpy (c+2, u+2, k*2); // copy x
memcpy (c, u[k*4+1] & 1? "03": "02", 2); // set first byte per low bit of y
c[k*2+2] = '\0'; // string terminator
Или, если вам не нужно сохранять несжатую форму, вы можете проще -используйте его OpenSSL_mallo c 'ed (хотя часть его тратится впустую):
u[1] = '2' | u[k*4+1] & 1;
// leave u[0] and u[2..k*2+1] alone
u[k*2+2] = '\0';