Это портативно, но далеко не так неэффективно, как использование printf / scanf
void longtochar(char *buffer, unsigned long number) {
int i;
for (i=0; i<sizeof(long); i++) {
buffer[i] = number & 0xFF; // place bottom 8 bits in char
number = number >> 8; // shift down remaining bits
}
return; // the long is now stored in the first few (2,4,or 8) bytes of buffer
}
И снова распаковать его (при условии, что длина одного размера)
long chartolong(char *buffer) {
long number = 0;
int i;
for (i=sizeof(long)-1; i>=0; i--) {
number = number << 8; // left shift bits in long already
number += buffer[i]; // add in bottom 8 bits
}
return number;
}
Обратите внимание на БОЛЬШОЕ предположение, что long - это одна и та же длина в обеих системах. Безопаснее всего сделать #include и использовать предоставляемые им типы (uint32_t или uint16_t).
Кроме того, мой код имеет длинную строку без знака. Сейчас у меня нет доступа к компилятору C, поэтому я не могу подтвердить, будет ли он работать со знаком целыми числами. Если мне не изменяет память, ее поведение может быть неопределенным (хотя это может не иметь значения, как я справлюсь с этим).