我对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/