Как заставить printf () получить значение из нетипизированного (или байтовой последовательности) буфера - PullRequest
1 голос
/ 26 августа 2010

У меня есть буфер необработанных значений, скажем, void* buffer или лучше, char* buffer - поток необработанных байтов, например, считанный из файла.Я бы хотел, чтобы байты в буфере были представлены и отображены несколькими способами, например, как float или как long long во время выполнения.Я бы попросил пользователя указать желаемую строку формата, например, %10d, и передать строку формата в printf().Однако в printf() нет спецификаторов формата, поэтому можно ожидать нетипизированный (или поток байтов) буфер в качестве второго аргумента?

Как я могу сказать printf() получить ожидаемые данные из буфера и отобразить их в соответствии с заданной строкой формата?Я не хотел бы использовать switch-case или if-then деревья.

Ответы [ 3 ]

0 голосов
/ 27 августа 2010

Это невозможно сделать без конструкции типа switch().Если бы printf() имел такую ​​функциональность, он все равно был бы реализован в условном блоке switch() { }, который обрабатывает спецификаторы формата.

0 голосов
/ 27 августа 2010

Вам необходимо десериализовать поток байтов в значения.И байты, и float s являются нетекстовыми двоичными файлами, но перевод между ними по-прежнему зависит от порядка байтов и, чтобы быть педантичным, зависит ли машина от математики IEEE FP.

Как только вы правильно прочитали байтыв собственные значения, просто используйте обычные спецификаторы формата.

Если вы уверены, что перевод байтов не требуется, просто приведите void* к нужному float* или как угодно, разыменуйте указатель и напечатайте егопо-прежнему.Но это очень непереносимо и может привести к сбою на неправильной машине.

0 голосов
/ 26 августа 2010
void printUINT(const unsigned char *b,size_t bsize)
{
  size_t len=0;
  bsize-=sizeof(int);
  for(; len<=bsize; len+=sizeof(int));
    printf("%u\n",*(unsigned*)&b[len]);
}
void printULONG(const unsigned char *b,size_t bsize)
{
  size_t len=0;
  bsize-=sizeof(long);
  for(; len<=bsize; len+=sizeof(long));
    printf("%lu\n",*(unsigned long*)&b[len]);
}
void printDOUBLE(const unsigned char *b,size_t bsize)
{
  size_t len=0;
  bsize-=sizeof(double);
  for(; len<=bsize; len+=sizeof(double));
    printf("%f\n",*(double*)&b[len]);
}
...