У меня есть матрица (2-D int pointer int **mat
), которую я пытаюсь записать в файл в Linux в Little-endian конвенции.Контекст Little-endian и сохранение в двоичном файле
Вот моя функция, которая записывает в файл:
#define BUFF_SIZE 4
void write_matrix(int **mat, int n, char *dest_file) {
int i, j;
char buff[BUFF_SIZE];
int fd = open(dest_file, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IXUSR);
if (fd < 0) {
printf("Error: Could not open the file \"%s\".\n", dest_file);
}
buff[0] = (n & 0x000000ff);
buff[1] = (n & 0x0000ff00) >> 8;
buff[2] = (n & 0x00ff0000) >> 16;
buff[3] = (n & 0xff000000) >> 24;
write(fd, buff, BUFF_SIZE);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
buff[0] = (mat[i][j] & 0x000000ff);
buff[1] = (mat[i][j] & 0x0000ff00) >> 8;
buff[2] = (mat[i][j] & 0x00ff0000) >> 16;
buff[3] = (mat[i][j] & 0xff000000) >> 24;
if (write(fd, buff, BUFF_SIZE) != BUFF_SIZE) {
close(fd);
printf("Error: could not write to file.\n");
return;
}
}
}
close(fd);
}
Проблема заключается в том, что, когда я пишу из матрицы достаточно формы mat[i][i] = i
большой (скажем, 512 X 512), я думаю, что я получаю переполнение, так как я получаю странные отрицательные числа.
Чтобы преобразовать обратно я использую:
void read_matrix(int fd, int **mat, int n, char buff[]) {
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
assert(read(fd, buff, BUFF_SIZE) == BUFF_SIZE);
mat[i][j] = byteToInt(buff);
}
}
}
int byteToInt(char buff[]) {
return (buff[3] << 24) | (buff[2] << 16) | (buff[1] << 8) | (buff[0]);
}
Какой я делаю неправильно?
EDITED:
Добавлена функция
read_matrix
.Похоже, я получаю
short
вместо наint
, так как 384 = (110000000) становится -128 = (бин) +1000000Сделала тест, и выяснили, что:
char c = 128; int i = 0; i | = c;
i = -128
. Зачем????
, пожалуйста, покажите пример вызова этого вопроса, как его настроить? – Jasen
Скорее всего, не проблема, но ваша проверка ошибок является странной. Перед тем, как проверить, будет ли fd меньше нуля, вы пишете файл. – FDinoff
@FDinoff вы правы насчет проверки на успешное открытие ... Исправление! –