Int-поток в C - PullRequest
       29

Int-поток в C

2 голосов
/ 19 октября 2011

Я реализую функцию в C, где я конвертирую byte [] в int []. Проблема в том, что длина int [] зависит от содержимого байта [] (а не только от длины байта []), поэтому я не буду знать общую длину int [], пока я не выполню итерацию весь байт []. Поэтому я ищу какую-нибудь форму av int-stream или динамически увеличивающийся int-список, в который я могу записать, а затем преобразовать в int [], как только я закончу писать все целые. Мой C-опыт в настоящее время немного ограничен, поэтому я не совсем уверен, что считается наилучшей практикой для решения такого рода проблем. Есть предложения?

Ответы [ 4 ]

5 голосов
/ 19 октября 2011

Самый простой метод - выделить int[] такой же длины (количество элементов), что и byte[], а когда вы закончите и узнаете размер, вызовите realloc, чтобы уменьшить его.

Это предполагает, конечно, что при интерпретации данных никогда не будет получено больше целых чисел, чем в потоке байтов.

2 голосов
/ 19 октября 2011

Есть несколько способов сделать это, я могу придумать.

Я предполагаю, исходя из вашего вопроса, что преобразование ваших char[] в соответствующие int[] s является дорогостоящим (вот почему вы хотите избежать выполнения этого вычисления дважды - один раз, чтобы определить размер, и снова, чтобы заполнить содержимое.

Итак, вот как я бы это сделал:

Во-первых, есть ли максимальный размер, который вы можете связать с преобразованием? EX: есть максимальная разница в размере 2 к 1? (Для каждого символа в char [] он может создавать целые числа «до X»?)

Если это так, и использование памяти не является проблемой (вы не ограничены супер) - выделите максимальный размер, заполните его при выполнении перевода и перераспределите, когда вы закончите сократить ваш след памяти.

Если это не так, вы находитесь в более жестких водах, и вам следует обратить внимание на несмежные схемы, такие как связанный список. После того как вы выполнили перевод и создали свой связанный список, вы можете выделить место для вашего массива и посетить каждый элемент в связанном списке, чтобы заполнить массив.

2 голосов
/ 19 октября 2011

Во-первых, если вы можете использовать C ++, то вы можете просто использовать vector, который представляет собой массив динамического размера.В противном случае вам придется сначала пройтись по байтовому массиву, чтобы определить, каким должен быть размер массива int, а затем динамически выделить массив int.Во-вторых, C не имеет типа byte, поэтому обычно используется тип char.

#include <stdlib.h>
char byte_array[ size ];
int i, int_size = 0;
int *int_array;

for ( i = 0; i < size; i++ ) {
  int_size += f( byte_array[i] );
}
int_array = (int*) malloc( int_size );

, где f() - это некоторая написанная вами функция, которая просматривает один элемент массива байтовчтобы определить размер массива int.

2 голосов
/ 19 октября 2011

Сначала проверьте byte [], чтобы определить результирующий размер int [].Затем используйте malloc() для выделения структуры int [] соответствующего размера.

#include <stdlib.h>

...
    // imagine that the resulting int[] size depends on the sum of the bytes

    int j, size = 0;
    for (j = 0;  byte[j];  ++j)
         size += byte[j];

     int *int_array = (int *) malloc (size);
     for (j = 0;  j < size;  ++j)
          int_array [j] = whatever;
...