我希望能够通过网络套接字从HTTP服务器(A jpeg)下载文件。然后我需要将下载的文件传递给c-jpeg-steganography http://code.google.com/p/c-jpeg-steganography/。我可以使用libcurl下载文件,然后将文件名传递到库中,但如果我不需要,我宁愿不这样做。我可以下载该文件,然后直接将其直接传递给c-jpeg-steganography吗?有一种简单的方法可以修改c-jpeg-steganography库吗?写入临时文件是不是一个坏的方法吗?
我非常喜欢C菜鸟...请放轻松。我的大多数经验都是用语言让我作弊并为我做所有的工作。
答案 0 :(得分:1)
隐写网站没有提供API详细信息AFAICS,这是一个麻烦。
但是,从你的问题来看,似乎有一个隐写函数需要一个开放的 FILE *
(你永远不会处理FILE
),其中包含未经修改的图像,并且可能是你正在尝试的信息隐藏在图像中。在这种情况下,您可以安排通过libcurl
将文件下载到一个打开的文件(可能没有名称);然后,您可以回滚FILE *
并将其传递给隐写图库。
下载了库后,提供的两个主要功能是:
/**
* 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);
/**
* 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)
没有标准的方法来假装内存缓冲区是一个文件,所以你真的只限于你提出的两个解决方案之一:
我知道我最初的方式,这是第一个选择。这是最简单的方法(如最快进入市场)。
从对源的检查来看,将其更改为处理内存而不是文件所涉及的工作并非易事。
encode
,decode
和estimate
函数都调用单个worker
超级函数,它接收文件名,打开它,然后传递文件处理其他功能相当多。
这是可行的,但是工作量远大于仅使用临时文件(尽管记住它只需要完成一次,然后生成的代码可供全世界使用)。