我有一个原始值的缓冲区,比如void* buffer或更好的char* buffer -一个原始字节流,例如,从文件中读取。我希望缓冲区中的字节以多种方式表示和显示,例如,在运行时作为float或long long。我会要求用户提供所需的格式字符串,例如%10d,然后将格式字符串传递给printf()。但是,printf()中没有格式说明符,所以它会期望一个非类型化(或字节流)缓冲区作为第二个参数?
如何告诉printf()从缓冲区获取预期的数据,并根据给定的格式字符串显示这些数据?我不喜欢使用switch-case或if-then树。
发布于 2010-08-27 11:18:42
您需要将字节流反序列化为值。字节和float都是非文本二进制的,但它们之间的转换仍然取决于字节顺序,以及机器是否具有IEEE数学。
一旦您正确地将字节读入本机值,只需使用常规格式说明符。
如果您确定不需要进行字节转换,只需将void*转换为所需的float*或其他值,取消对指针的引用,然后照常打印。但是,这是非常不可移植的,并且可能会在错误的机器上崩溃。
发布于 2010-08-26 20:31:48
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]);
}发布于 2010-08-27 10:50:54
如果没有switch()-type构造,这是不可能完成的。如果printf()有这样的功能,它无论如何都会在处理格式说明符的概念switch() { }块中实现。
https://stackoverflow.com/questions/3574746
复制相似问题