2

我正在使用 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);

这就是我打印出来的:

框架->ID = 0x0.0000000037d0cp-1022

甚至尝试

printf("frame->ID= %a\n",frame->ID);

给我同样的输出。

这是整数格式吗??如果是的话,我怎么能将这种格式的 char * 转换为 int?

提前致谢。

4

3 回答 3

4

使用%d格式说明符,因为frame->ID它是一个整数:

snprintf(IDbuffer,10,"%d",frame->ID);

然后使用%s格式说明符打印缓冲区:

printf("frame->ID= %s\n",IDbuffer);

在printf手册页中有更多关于格式说明符的信息。

于 2013-01-06T09:44:18.860 回答
2

%e格式说明符需要一个类型的参数double,而您传递的是一个int。结果行为是未定义的。这里的所有都是它的。

通过使用%e,您承诺snprintf. 你保证你会double在相应的位置提供一个论据。稍后,您通过提供int而不是来破坏该承诺double,这会导致毫无意义的结果。你基本上是在snprintf撒谎frame->ID

%a也需要double论证。为什么你坚持使用doubleint参数的格式说明符?你希望这如何工作?

要么提供正确类型的参数(即double),要么使用正确的格式说明符(即%dfor int)。不管是这个还是那个。像你这样把事情混在一起不会有任何成就。

于 2013-01-06T09:43:25.197 回答
1

您需要ID在打印之前强制加倍:

snprintf(IDbuffer,10,"%e", (double)frame->ID);

或者,您可以将其打印为整数:

snprintf(IDbuffer,10,"%d", frame->ID)

检查此以获取有关snprintf的更多信息

于 2013-01-06T09:43:46.007 回答