如何获取网络缓冲区并将其传递给期望C中的FILE的函数

时间:2011-03-29 01:44:15

标签: c buffer

我希望能够通过网络套接字从HTTP服务器(A jpeg)下载文件。然后我需要将下载的文件传递给c-jpeg-steganography http://code.google.com/p/c-jpeg-steganography/。我可以使用libcurl下载文件,然后将文件名传递到库中,但如果我不需要,我宁愿不这样做。我可以下载该文件,然后直接将其直接传递给c-jpeg-steganography吗?有一种简单的方法可以修改c-jpeg-steganography库吗?写入临时文件是不是一个坏的方法吗?

我非常喜欢C菜鸟...请放轻松。我的大多数经验都是用语言让我作弊并为我做所有的工作。

2 个答案:

答案 0 :(得分:1)

隐写网站没有提供API详细信息AFAICS,这是一个麻烦。

但是,从你的问题来看,似乎有一个隐写函数需要一个开放的FILE *(你永远不会处理FILE),其中包含未经修改的图像,并且可能是你正在尝试的信息隐藏在图像中。在这种情况下,您可以安排通过libcurl将文件下载到一个打开的文件(可能没有名称);然后,您可以回滚FILE *并将其传递给隐写图库。

下载了库后,提供的两个主要功能是:

steganolab_encode

/**
 * Modifies specified jpeg file so that it contains given message.
 * @param file - jpeg file name
 * @param data - message to embed
 * @param len - message length
 * @param password - key string to cipher data and set up PRNG
 * @param DCT_radius - which DCT coefficients shall be used to carry
 *      information, i^2+j^2 <= R^2
 * @param stats - pointer to structure to put statistics to. The caller
 * must take care about freeing the structure properly. NULL pass
 * disables statistics output.  The object don't need to be freed if the
 * function fails, and it contains no message.
 * @return              0: All OK
 *                              not 0: Failed
 **/
int steganolab_encode(const char * file, const char * data,
        unsigned int len, const char * password, uint8_t DCT_radius,
        struct steganolab_statistics * stats);

steganolab_decode

/**
 * Reads steganographic message from specified file
 * @param file - jpeg file name
 * @param data - pointer to pointer to string to put data to
 * @param len - pointer to push obtained buffer length to
 * @param password - secred string for cipher and PRNG
 * @param DCT_radius - which DCT coefficients shall be used to carry
 *      information, i^2+j^2 <= R^2
 * @param stats - statistics object. Free is up to the caller.
 * NULL disables the feature.  The object don't need to be freed if the
 * function fails, and it contains no message.
 * @return      0: All OK
 *                      not 0: fail (no buffers need freeing in this case)
 */
int steganolab_decode(const char * file, char ** data,
        unsigned int * len, const char * password, uint8_t DCT_radius,
        struct steganolab_statistics * stats);

由于函数需要文件名,因此您必须提供文件名。或者你必须重写代码以记住你的想法 - 缓冲区或打开文件流。

(旁白:代码坚持使用古老和非标准标题<malloc.h>来获取size_t的定义。如果您将每个引用替换为<malloc.h>,它将编译为对象(或"malloc.h")与<stdlib.h>;如果唯一需要的声明为<stddef.h>,理论上可以使用size_t进行编译。)

答案 1 :(得分:0)

没有标准的方法来假装内存缓冲区是一个文件,所以你真的只限于你提出的两个解决方案之一:

  • 将信息写入文件,然后将文件名传递给库;或
  • 重新编写库以获取内存缓冲区。

我知道我最初的方式,这是第一个选择。这是最简单的方法(如最快进入市场)。

从对源的检查来看,将其更改为处理内存而不是文件所涉及的工作并非易事。

encodedecodeestimate函数都调用单个worker超级函数,它接收文件名,打开它,然后传递文件处理其他功能相当多。

这是可行的,但是工作量远大于仅使用临时文件(尽管记住它只需要完成一次,然后生成的代码可供全世界使用)。