Однако, хотя длина буфера является правильной, а выход MPZ_EXPORT и MPZ_IMPORT , кажется, на наиболее полезных, Is Fields, Is Fieldds, Is Fieldds, It Fieldds, Is Fieldds, It Fieldds, Is Fieldds, It Fieldds, It Fieldds, It Fieldds, It Fieldds. sigfpe (исключение с плавающей запятой) при попытке десериализировать массив v внутри msk .
- os: linux (WSL2 Ubuntu)
/> - node.js: 64-bit
- C ++ использует библиотеку GMP
- JavaScript общается с C ++ через Node-ffi-napi
/> Я использую mpz_export и mpz_import с этими параметрами:
Код: Выделить всё
// export
mpz_export(buffer + offset, &len, 1, 1, 1, 0, mpz_value);
// import
mpz_import(mpz_value, len, 1, 1, 1, 0, data + offset);
< /code>
📦 Структура сериализации < /h3>
В c ++ я хранят сериализованные данные в этом порядке: < /p>
[list]
[*] idOfDO[*]
Код: Выделить всё
userList[]: massiv mpz_t
polynomial[][*]
Код: Выделить всё
xList[]: massiv mpz_t
alpha[]: massiv mpz_t
U[][*]
Код: Выделить всё
V[][/list]
Каждый mpz_t сохраняется с помощью:
- Сначала написано.)
Код: Выделить всё
size_t - Тогда mpz_export его двоичных данных
Код: Выделить всё
size_t len = 0;
memcpy(&len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
mpz_import(V[i], len, 1, 1, 1, 0, data + offset);
offset += len;
[*] Все поля до v [] deserialize правильно. />
[*] MPZ_IMPORT Call для v [0] вызывает sigfpe .
[*] подтверждено, что Len является неэлезом и в пределах границ перед вызовом mpz_import . />
Код: Выделить всё
V[*]
Код: Выделить всё
k = 2< /code> на протяжении всей сериализации и десериализации (проверяется через журналы). < /p>
< /li>
Общий размер буфера и размеры сегментов согласован. LEN [*] Обеспеченное буфер не усекается во время node.js base64 Encode/decode.
[*] Код-код order код. (например, с использованием order = -1 ).
[*] Заменил по умолчанию mpz_import (..., 1, 1, 1, 0, ...) с другими комбинациями -та же ошибка. size. < /p>
< /li>
< /ul>
, возможно, выравнивание между mpz_export < /code> и mpz_import < /code>? V [] буфер запускается по неверному адресу из -за смещения после u [] ?
Может ли быть переполнение или memcpy Ошибка смещения? Data + Offset) < /code> Для всех значений? < /p>
< /li>
< /ul>
при каких терзах может быть Mpz_import < /code>, что Sigfpe < /code>? mpz_export /
Код: Выделить всё
mpz_importЕсть ли лучшие практики для сериализации/десериализации массивов mpz_t между языками? V [] :
memcpy(&V_len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
for (int i = 0; i < (k+1)*(k+1); i++) {
size_t len = 0;
memcpy(&len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
mpz_import(V, len, 1, 1, 1, 0, data + offset); //
offset += len;
}
< /code>
#include
#include
#include
struct MSK {
mpz_t idOfDO, idOfServer;
mpz_t userList[2];
mpz_t xList[2];
int l = 2;
int t = 2;
MSK() {
mpz_init(idOfDO); mpz_init(idOfServer);
for (int i = 0; i < l; i++) mpz_init(userList);
for (int i = 0; i < t; i++) mpz_init(xList);
}
~MSK() {
mpz_clear(idOfDO); mpz_clear(idOfServer);
for (int i = 0; i < l; i++) mpz_clear(userList);
for (int i = 0; i < t; i++) mpz_clear(xList);
}
unsigned char* getMSK(size_t *size) {
size_t idOfDO_len=0, idOfServer_len=0, userList_len=0, xList_len=0;
mpz_export(NULL, &idOfDO_len, 1, 1, 1, 0, idOfDO);
mpz_export(NULL, &idOfServer_len, 1, 1, 1, 0, idOfServer);
for (int i = 0; i < l; i++) {
size_t len=0;
mpz_export(NULL, &len, 1, 1, 1, 0, userList);
userList_len += len + sizeof(size_t);
}
for (int i = 0; i < t; i++) {
size_t len=0;
mpz_export(NULL, &len, 1, 1, 1, 0, xList);
xList_len += len + sizeof(size_t);
}
size_t total_len = sizeof(size_t)*6 + idOfDO_len + idOfServer_len + userList_len + xList_len;
*size = total_len;
unsigned char *buffer = (unsigned char*)malloc(total_len);
size_t offset = 0;
memcpy(buffer + offset, &idOfDO_len, sizeof(size_t));
offset += sizeof(size_t);
mpz_export(buffer + offset, NULL, 1, 1, 1, 0, idOfDO);
offset += idOfDO_len;
memcpy(buffer + offset, &idOfServer_len, sizeof(size_t));
offset += sizeof(size_t);
mpz_export(buffer + offset, NULL, 1, 1, 1, 0, idOfServer);
offset += idOfServer_len;
memcpy(buffer + offset, &userList_len, sizeof(size_t));
offset += sizeof(size_t);
for (int i = 0; i < l; i++) {
size_t len = 0;
mpz_export(NULL, &len, 1, 1, 1, 0, userList);
memcpy(buffer + offset, &len, sizeof(size_t));
offset += sizeof(size_t);
mpz_export(buffer + offset, NULL, 1, 1, 1, 0, userList);
offset += len;
}
memcpy(buffer + offset, &xList_len, sizeof(size_t));
offset += sizeof(size_t);
for (int i = 0; i < t; i++) {
size_t len = 0;
mpz_export(NULL, &len, 1, 1, 1, 0, xList);
memcpy(buffer + offset, &len, sizeof(size_t));
offset += sizeof(size_t);
mpz_export(buffer + offset, NULL, 1, 1, 1, 0, xList[i]);
offset += len;
}
return buffer;
}
void setMSK(unsigned char *data) {
size_t offset = 0;
size_t idOfDO_len=0, idOfServer_len=0, userList_len=0, xList_len=0;
memcpy(&idOfDO_len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
mpz_import(idOfDO, idOfDO_len, 1, 1, 1, 0, data + offset);
offset += idOfDO_len;
memcpy(&idOfServer_len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
mpz_import(idOfServer, idOfServer_len, 1, 1, 1, 0, data + offset);
offset += idOfServer_len;
memcpy(&userList_len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
for (int i = 0; i < l; i++) {
size_t len = 0;
memcpy(&len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
mpz_import(userList[i], len, 1, 1, 1, 0, data + offset);
offset += len;
}
memcpy(&xList_len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
for (int i = 0; i < t; i++) {
size_t len = 0;
memcpy(&len, data + offset, sizeof(size_t));
offset += sizeof(size_t);
mpz_import(xList[i], len, 1, 1, 1, 0, data + offset);
offset += len;
}
}
< /code>
};
Подробнее здесь: https://stackoverflow.com/questions/796 ... -t-array-b