我对C相当陌生,并且编写了一个简单程序,该程序以指定的频率和采样率生成正弦波,并将其作为无符号8位字节发送到stdout。

#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));
    }
}


但是,一旦该值大于65536,程序将开始向stdout发送32位。我可以使用putchar更好的替代方法来正确包装吗?

最佳答案

您要输出一个以两个字节编码的值。因此,依次输出这两个字节。哪两个字节?这取决于如何将16位值编码为两个8位值,即取决于将读取这两个字节的系统的endianness

小端:

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


大端:

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


如果读取该值的系统具有与您的CPU相同的字节序,则可以使用不同的策略:通过转储其内存内容来写入该值。您可以读取内存中的任何值作为字节数组,也可以使用fwrite写入字节数组。

uint16_t w = sinco(…);
fwrite(&w, 1, 2, stdout);

关于c - 对于16位数据,我应该使用什么代替putchar()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50709925/

10-11 18:23