首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何告诉printf()从非类型化(或字节序列)缓冲区中获取值

如何告诉printf()从非类型化(或字节序列)缓冲区中获取值
EN

Stack Overflow用户
提问于 2010-08-26 19:47:24
回答 3查看 278关注 0票数 1

我有一个原始值的缓冲区,比如void* buffer或更好的char* buffer -一个原始字节流,例如,从文件中读取。我希望缓冲区中的字节以多种方式表示和显示,例如,在运行时作为floatlong long。我会要求用户提供所需的格式字符串,例如%10d,然后将格式字符串传递给printf()。但是,printf()中没有格式说明符,所以它会期望一个非类型化(或字节流)缓冲区作为第二个参数?

如何告诉printf()从缓冲区获取预期的数据,并根据给定的格式字符串显示这些数据?我不喜欢使用switch-caseif-then树。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-27 11:18:42

您需要将字节流反序列化为值。字节和float都是非文本二进制的,但它们之间的转换仍然取决于字节顺序,以及机器是否具有IEEE数学。

一旦您正确地将字节读入本机值,只需使用常规格式说明符。

如果您确定不需要进行字节转换,只需将void*转换为所需的float*或其他值,取消对指针的引用,然后照常打印。但是,这是非常不可移植的,并且可能会在错误的机器上崩溃。

票数 0
EN

Stack Overflow用户

发布于 2010-08-26 20:31:48

代码语言:javascript
复制
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]);
}
票数 0
EN

Stack Overflow用户

发布于 2010-08-27 10:50:54

如果没有switch()-type构造,这是不可能完成的。如果printf()有这样的功能,它无论如何都会在处理格式说明符的概念switch() { }块中实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3574746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档