通过本文主要向大家介绍了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>