通过本文主要向大家介绍了linux ed2k,linux 下载ed2k,linux ed2k下载工具,linux 软链,linux 删除软链等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
本程序依赖 c99, 只支持终端“标准输入”,转换成的链接以”标准输出“而输出,错误以”标出错误输出“而输出。
md4 编码代码来自网络。
编译命令:gcc -std=c99 -o ed2k md4.c ed2k.c utils.c
用户命令:ed2k <File...>
产生的链是最简短的形式:ed2k://|file|<FileName>|<FileSize>|<FileHash>|/
c++版本:
编译命令:g++ -o ed2k ed2k.cpp utils.cpp MD4Hash.cpp ED2KHash.cpp
用户命令:ed2k <File...> (虽然--help可以看到其它选项,但都没实现)
defs.h
#ifndef MYCODE_DEFS_H
#define MYCODE_DEFS_H
#include <stdint.h> /* uint32_t ... */
#include <stddef.h> /* size_t, ssize_t */
#include <stdbool.h>
#endif
#if __cplusplus
# define BEGIN_NAMESPACE_MYCODE namespace mc {
# define END_NAMESPACE_MYCODE }
# if __cplusplus < 201103L
# define nullptr ((void*)0)
# endif
#endif /* __cplusplus */
#endif /* MYCODE_DEFS_H */
</div>
utils.h
#ifndef MYCODE_UTILS_H
#define MYCODE_UTILS_H
#include <stdio.h>
#if __cplusplus
# include <utility>
# include <string>
# include <fstream>
#endif /* __cplusplus */
#include "defs.h"
#if __cplusplus
extern "C" {
#endif
#undef byteswap32
#define byteswap32(x) \
( (((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
(((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24) )
#undef htobe32
#undef htole32
#if __BYTE_ORDER == __LITTLE_ENDIAN
# define htobe32(x) byteswap32(x)
# define htole32(x) (x)
#else
# define htobe32(x) (x)
# define htole32(x) byteswap32(x)
#endif
enum { string_npos = (size_t)-1 };
/* 查找字符串 str 中第一个与 c 匹配的字符,返回该字符在字符串中的下标, 失败返回 string_npos */
size_t string_find(const char *str, size_t size, char c);
/* 逆向查找*/
size_t string_rfind(const char *str, size_t size, char c);
void setBigEndian_uint32(uint32_t *data, size_t n);
char* toHexString_uint32(char *buf, size_t bufSize,
const uint32_t *data, size_t n);
char* createShortFileName(char *buf, size_t bufSize,
const char *fullName, size_t size);
/* 成功时返回指针 fullName 某部分的地址, 失败时返回 NULL */
const char* getShortFileName(const char* fullName, size_t size);
/* 当返回0大小时, 需要检查state, state == 0 表示失败 */
size_t getFileSize(FILE *in, int *state);
#if __cplusplus
} /* extern "C" */
#endif
/******************************************************************************
* c++
*****************************************************************************/
#if __cplusplus
BEGIN_NAMESPACE_MYCODE
# if __cplusplus >= 201103L
# define mc_move(x) std::move(x)
# else
# define mc_move(x) (x);
# endif
///////////////////////////////////////////////////////////////////////////////
template<class T>
void setBigEndian(T*, size_t);
template<>
inline void setBigEndian<uint32_t>(uint32_t *p, size_t n)
{ setBigEndian_uint32(p, n); }
///////////////////////////////////////////////////////////////////////////////
template<class T>
std::string toHexString(T*, size_t);
template<>
inline std::string toHexString<uint32_t>(uint32_t *p, size_t n)
{
std::string strHex;
char buf[9];
for (size_t i = 0; i < n; ++i) {
sprintf(buf, "%08X", p[i]);
strHex += buf;
}
return mc_move(strHex);
}
///////////////////////////////////////////////////////////////////////////////
std::string getShortFileName(const std::string& fullName);
void getShortFileName(std::string *shortName, const std::string& fullName);
size_t getFileSize(std::ifstream& f);
END_NAMESPACE_MYCODE
#endif /* __cplusplus */
#endif /* MYCODE_UTILS_H */
</div>
utils.c
#include "utils.cpp"</div>
utils.cpp
#include <string.h>
#include "utils.h"
#if __cplusplus
extern "C" {
#endif
void setBigEndian_uint32(uint32_t *data, size_t n)
{
for (size_t i = 0; i < n; ++i)
data[i] = htobe32(data[i]);
}
char* toHexString_uint32(char *buf, size_t bufSize, const uint32_t *data, size_t n)
{
char *p = buf;
size_t i = 0;
size_t one_uint32_size = sizeof(uint32_t);
if ( one_uint32_size * n < bufSize )
{
while (i < n) {
sprintf(p, "%08X", data[i++]);
p += 8;
}
}
*p = '\0';
return buf;
}
size_t string_find(const char *str, size_t size, char c)
{
size_t pos = 0;
while (pos < size) {
if (str[pos] == c)
return pos;
++pos;
}
return string_npos;
}
size_t string_rfind(const char *str, size_t size, char c)
{
while (size) {
if (str[--size] == c)
return size;
}
return string_npos;
}
char* createShortFileName(char *buf, size_t bufSize,
const char *fullName, size_t size)
{
const char * p = getShortFileName(fullName, size);
buf[0] = '\0';
if (p)
{
size_t len = strlen(p);
if (bufSize > len)
memcpy(buf, p, len + 1);
}
return buf;
}
const char* getShortFileName(const char *fileName, size_t size)
{
#if _WIN32
char c = '\\';
#else
char c = '/';
#endif
size_t pos = string_rfind(fileName, size, c);
if (pos == string_npos)
return NULL;
else
return fileName + (pos + 1);
}
size_t getFileSize(FILE *in, int *state)
{
*state = 0;
if (!in)
return 0;
size_t curpos = ftell(in);
if (fseek(in, 0, SEEK_END) == -1)
return 0;
size_t fileSize = ftell(in);
if (fseek(in, curpos, SEEK_SET) == -1)
return 0;
*state = 1;
return fileSize;
}
#if __cplusplus
} /* extern "C" */
#endif
/******************************************************************************
* c++
*****************************************************************************/
#if __cplusplus
BEGIN_NAMESPACE_MYCODE
void getShortFileName(std::string *shortName, const std::string& fullName)
{
# if _WIN32
char c = '\\';
# else
char c = '/';
# endif
size_t pos = fullName.rfind(c);
if (pos == std::string::npos)
shortName->assign(fullName);
else
shortName->assign(fullName.begin() + pos + 1, fullName.end());
}
std::string getShortFileName(const std::string& fullName)
{
std::string shortName;
getShortFileName(&shortName, fullName);
return mc_move(shortName);
}
size_t getFileSize(std::ifstream& f)
{
f.seekg(0, f.end);
size_t fileSize = f.tellg();
f.seekg(0);
return fileSize;
}
END_NAMESPACE_MYCODE
#endif /* __cplusplus */
</div>
md4.h
#ifndef MYCODE_MD4_H
#define MYCODE_MD4_H
#include "defs.h"
#if __cplusplus
extern "C" {
#endif
enum { MD4_COUNT_SIZE = 8, MD4_STATE_SIZE = 16, MD4_BUFFER_SIZE = 64 };
typedef struct {
uint32_t count[2];
uint32_t state[4];
uint8_t buffer[MD4_BUFFER_SIZE];
} md4_t;
#define md4_data(md4_ptr) ((char*)((md4_ptr)->state))
#define md4_cdata(md4_ptr) ((const char*)((md4_ptr)->state))
#define md4_dataSize() (MD4_STATE_SIZE)
void md4_reset(md4_t *md4);
void md4_update(md4_t *md4, const char *src, size_t srcSize);
void md4_finish(md4_t *md4);
void md4_setBigEndian(md4_t *md4);
char* md4_toHashString(char dest[33], const md4_t *md4);
#if __cplusplus
}
#endif
#endif /* MYCODE_MD4_H */
</div>
md4.c
/* #include <endian.h> */ #include <stdio.h> #include <string.h>

