Что я должен использовать вместо putchar () для 16-битных данных? - PullRequest
0 голосов
/ 06 июня 2018

Я довольно новичок в C и написал простую программу, которая генерирует синусоидальную волну с заданной частотой и частотой дискретизации и отправляет ее на стандартный вывод в виде 8-разрядного байта без знака.

#include <stdio.h>
#include <math.h>
#include <stdint.h>

uint8_t sinco(int iCarrier, int iSampleRate, unsigned long ulIndex){return (sin(iCarrier * (2 * M_PI) * ulIndex / iSampleRate) * 127) + 128;}

void main(){    
    unsigned long t;
    const int iCarrier = 500;
    const int iSampleRate = 8000;

    for(t=0;;t++){
        putchar(sinco(iCarrier, iSampleRate, t));
    }
}

Я понимаю, что putchar () была не самой подходящей функцией, но она работала для того, что мне было нужно в то время.Сейчас я пытаюсь изменить программу для вывода беззнакового 16-битного числа, но я не уверен, что заменить putchar () на.

Это то, что я до сих пор:

#include <stdio.h>
#include <math.h>
#include <stdint.h>

uint16_t sinco(int iCarrier, int iSampleRate, unsigned long ulIndex){return (sin(iCarrier * (2 * M_PI) * ulIndex / iSampleRate) * 65535) + 65536;}

void main(){    
    unsigned long t;
    const int iCarrier = 500;
    const int iSampleRate = 8000;

    for(t=0;;t++){
        printf(%hu, sinco(iCarrier, iSampleRate, t));
    }
}

Однако, когда значение становится больше, чем 65 536, программа начинает отправлять 32 бита на стандартный вывод.Есть ли лучшая альтернатива putchar, которую я могу использовать, которая будет правильно оборачиваться?

1 Ответ

0 голосов
/ 06 июня 2018

Вы хотите вывести значение, которое закодировано в двух байтах.Итак, выведите эти два байта подряд.Какие два байта?Это зависит от того, как 16-битное значение должно быть закодировано в двух 8-битных значениях, то есть от порядка байтов системы, которая будет считывать эти два байта.

Little-endian:

uint16_t w = sinco(…);
putchar(w & 0xff);
putchar((w >> 8) & 0xff);

Big-endian:

uint16_t w = sinco(…);
putchar((w >> 8) & 0xff);
putchar(w & 0xff);

Если система, которая читает значение, имеет тот же порядок байтов, что и ваш ЦП, тогда вы можете использовать другую стратегию: записать значение с помощьюсбрасывает содержимое своей памяти.Вы можете прочитать любое значение в памяти как массив байтов, и вы можете использовать fwrite для записи массива байтов.

uint16_t w = sinco(…);
fwrite(&w, 1, 2, stdout);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...