我正在使用OpenCV,我需要将Iplimage-> ID转换为char [],以便我可以使用TCP发送它,然后在服务器上将其重新转换为int。
这是Iplimage标题:
typedef struct _IplImage
{
int nSize;
int ID; //<--- ID of type INT
int nChannels;
int alphaChannel;
int depth;
char colorModel[4];
char channelSeq[4];
int dataOrder;
int origin;
int align;
int width;
int height;
struct _IplROI *roi;
struct _IplImage *maskROI;
void *imageId;
struct _IplTileInfo *tileInfo;
int imageSize;
char *imageData;
int widthStep;
int BorderMode[4];
int BorderConst[4];
char *imageDataOrigin;
}
IplImage;
这是我的代码:
char IDbuffer[10];
snprintf(IDbuffer,10,"%e",frame->ID);//where frame is of type IplImage*
printf("frame->ID= %a\n",IDbuffer);
这就是我印刷的内容:
frame-&gt; ID = 0x0.0000000037d0cp-1022
甚至尝试
printf("frame->ID= %a\n",frame->ID);
给我相同的输出。
这是整数格式吗?如果是,我怎么能将这种格式的char *转换为int ??
提前致谢。
答案 0 :(得分:4)
使用%d
格式说明符,因为frame->ID
是一个整数:
snprintf(IDbuffer,10,"%d",frame->ID);
然后使用%s
格式说明符打印缓冲区:
printf("frame->ID= %s\n",IDbuffer);
有关printf手册页中的格式说明符的更多信息。
答案 1 :(得分:2)
%e
格式说明符需要类型为double
的参数,而您传递的是int
。结果行为未定义。这就是它的全部内容。
使用%e
即表示您对snprintf
做出承诺。您保证在相应位置提供double
参数。之后你通过提供int
代替double
来破坏这一承诺,这会导致无意义的结果。您基本上对snprintf
的类型frame->ID
撒谎。
%a
还需要double
个参数。为什么要坚持使用带有double
参数的int
格式说明符?你觉得这个怎么样?
提供正确类型的参数(double
),或使用正确的格式说明符(%d
为int
)。无论是这个还是那个。像你一样混合起来将无法实现任何目标。
答案 2 :(得分:1)
在打印之前,您需要将ID
转换为双倍:
snprintf(IDbuffer,10,"%e", (double)frame->ID);
或者,您可以将其打印为整数:
snprintf(IDbuffer,10,"%d", frame->ID)
检查此项以获取有关snprintf
的更多信息