Advertisement
Guest User

Untitled

a guest
Dec 10th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.05 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "locale.h"
  4. #include "malloc.h"
  5. #include <string.h>
  6. #include <math.h>
  7.  
  8. /*
  9. file structure:
  10. ID3v2/file identifier "ID3"
  11. ID3v2 version $03 00
  12. ID3v2 flags %abc00000
  13. ID3v2 size 4 * %0xxxxxxx
  14.  
  15. Frame ID $xx xx xx xx (four characters)
  16. Size $xx xx xx xx
  17. Flags $xx xx
  18.  
  19. <Frame contents>
  20.  
  21. etc...
  22. */
  23.  
  24. int buffToIntegerForFrame(unsigned char *bytes) //char to integer size
  25. {
  26. return
  27. bytes[0] * pow(2, 24) + //2^21
  28. bytes[1] * pow(2, 16) + //2^14
  29. bytes[2] * pow(2, 8) + //2^7
  30. bytes[3];
  31. }
  32.  
  33. int buffToInteger(unsigned char *bytes) {
  34. return
  35. bytes[0] * 0x200000 + //2^21
  36. bytes[1] * 0x4000 + //2^14
  37. bytes[2] * 0x80 + //2^7
  38. bytes[3];
  39. }
  40.  
  41. void integerToBuff(int number, unsigned char *result) {
  42. result[0] = (unsigned char) ((number & 0xfe00000) >> 21); //0100000
  43. result[1] = (unsigned char) ((number & 0x1fc000) >> 14); //0010010
  44. result[2] = (unsigned char) ((number & 0x3f80) >> 7); //0000001
  45. result[3] = (unsigned char) (number & 0x7f); //0000100
  46. }
  47.  
  48. void integerToBuffForFrame(int number, unsigned char *result) {
  49. result[0] = (unsigned char) ((number & 0xff000000) >> 24); //0100000
  50. result[1] = (unsigned char) ((number & 0xff0000) >> 16); //0010010
  51. result[2] = (unsigned char) ((number & 0xff00) >> 8); //0000001
  52. result[3] = (unsigned char) (number & 0xff); //0000100
  53. }
  54.  
  55. struct tagHeader {
  56. unsigned char name[3]; //ID3
  57. unsigned char version[2]; //2 bytes ex. 3 0
  58. unsigned char flags; //1 byte
  59. unsigned int framesCount;
  60. unsigned int size; //4 bytes for tagHeader`s size
  61. };
  62. struct oframe {
  63. unsigned char name[4];//4 bytes FRAME NAME ex. TIT2, TALB and etc.
  64. unsigned char flags[2]; //2 bytes
  65. unsigned int size; //4 FRAME`S size
  66. unsigned char enc; //1 eencoding
  67. unsigned char *content; //container
  68. };
  69.  
  70. void readBytes(unsigned char *res, unsigned int size, FILE *file) {
  71. for (int i = 0; i < size; i++) {
  72. res[i] = getc(file);
  73. //printf("%c",res[i]);
  74. }
  75. }
  76.  
  77. void writeBytes(unsigned char *res, unsigned int size, FILE *file) {
  78. for (int i = 0; i < size; i++) {
  79. putc(res[i], file);
  80. }
  81. }
  82.  
  83. struct tagHeader readTagHeader(FILE *file) //function
  84. {
  85. struct tagHeader tag;
  86. unsigned char flags[1]; // flags
  87. unsigned char sizeb[4]; // tag size in bytes
  88. readBytes(tag.name, 3, file);
  89. readBytes(tag.version, 2, file);
  90. readBytes(flags, 1, file);
  91. readBytes(sizeb, 4, file);
  92. tag.flags = flags[0];
  93. tag.size = buffToInteger(sizeb);
  94. return tag;
  95. }
  96.  
  97. void writeTagHeader(FILE *file, struct tagHeader tag) //function
  98. {
  99. unsigned char flags[1]; // flags
  100. unsigned char sizeb[4]; // tag size in bytes
  101. writeBytes(tag.name, 3, file);
  102. writeBytes(tag.version, 2, file);
  103. flags[0] = tag.flags;
  104. writeBytes(flags, 1, file);
  105. integerToBuff(tag.size, sizeb);
  106. writeBytes(sizeb, 4, file);
  107. }
  108.  
  109. void writeFrame(FILE *file, struct oframe frame) //function
  110. {
  111. unsigned char sizeb[4]; // tag size in bytes
  112. unsigned char enc[1]; // tag size in bytes
  113. writeBytes(frame.name, 4, file);
  114. integerToBuffForFrame(frame.size, sizeb);
  115. writeBytes(sizeb, 4, file);
  116. writeBytes(frame.flags, 2, file);
  117. enc[0] = frame.enc;
  118. writeBytes(enc, 1, file);
  119. writeBytes(frame.content, frame.size - 1, file);
  120. }
  121.  
  122. int checkName(char *name) {
  123. for (int i = 0; i < strlen(name); i++) {
  124. if ((name[i] < 60 | name[i] > 90) & (name[i] > 57 | name[i] < 48)) {
  125. return 0;
  126. }
  127. }
  128. return 1;
  129. }
  130.  
  131. struct oframe readoframe(FILE *file, int readedBytes) {
  132. struct oframe frame;
  133. unsigned char sizeb[4]; // tag size in bytes
  134. readBytes(frame.name, 4, file);
  135. readBytes(sizeb, 4, file);
  136. frame.size = buffToIntegerForFrame(sizeb);
  137. if (frame.size + 10 > readedBytes | frame.size == 0 | frame.size > 134 * pow(10, 5) | checkName(frame.name) == 0) {
  138. fseek(file, frame.size + 2, SEEK_CUR);
  139. frame.size = 0;
  140. return frame;
  141. }
  142. frame.content = malloc(frame.size);
  143. readBytes(frame.flags, 2, file);
  144. unsigned char enc[1];
  145. readBytes(enc, 1, file);
  146. frame.enc = enc[0];
  147. readBytes(frame.content, frame.size - 1, file);
  148. return frame;
  149. }
  150.  
  151. void set(char *filepath, char *framename, char *value) {
  152. FILE *fp = fopen(filepath, "rb");
  153. struct tagHeader tag = readTagHeader(fp);
  154. int old_size = tag.size;
  155. tag.framesCount = 0;
  156. //END OF TAG HEADER
  157. int diff = 0;
  158. int bytesReaded = 10;
  159. struct oframe frames[tag.size / 11 + 1];
  160. int i = 0;
  161. while (tag.size > bytesReaded) {
  162. frames[tag.framesCount] = readoframe(fp, tag.size - bytesReaded);
  163. if (frames[tag.framesCount].size == 0) {
  164. break;
  165. }
  166. bytesReaded += 10 + frames[tag.framesCount].size;
  167. tag.framesCount += 1;
  168. }
  169. //END OF READING METADATA FROM FILE
  170. //BEGIN OF WRITING NEW FILE
  171. remove("temp.mp3");
  172. FILE *outf = fopen("temp.mp3", "wb");
  173. writeTagHeader(outf, tag);
  174. for (int i = 0; i < tag.framesCount; i++) {
  175. if (strcmp(frames[i].name, framename) == 0) {
  176. diff = strlen(value) - strlen(frames[i].content);
  177. tag.size += diff;
  178. strcpy(frames[i].content, value);
  179. frames[i].size = strlen(value) + 1;
  180. }
  181. writeFrame(outf, frames[i]);
  182. /*printf("%s %d ", frames[i].name, frames[i].size);
  183. for (int j = 0; j < frames[i].size; j++) {
  184. printf("%c", frames[i].content[j]);
  185. }
  186. printf("\n");*/
  187. }
  188. int pos;
  189. pos = ftell(outf);
  190. int countzeros = 10 + tag.size - ((int) pos);
  191. unsigned char zeros[countzeros];
  192. for (int i = 0; i < countzeros; i++) {
  193. zeros[i] = 0;
  194. }
  195. writeBytes(zeros, countzeros, outf);
  196. char tmp;
  197. fseek(fp, old_size + 10, SEEK_SET);
  198. fseek(outf, tag.size + 10, SEEK_SET);
  199. tmp = fgetc(fp);
  200. while (!feof(fp)){
  201. fputc(tmp, outf);
  202. tmp = fgetc(fp);
  203. }
  204.  
  205. //writeBytes(tmp, strlen(tmp), outf);
  206.  
  207.  
  208.  
  209. /*fgetpos (outf,&pos);
  210. fseek(fp, 0, SEEK_END); // seek to end of file
  211. int size = (int)ftell(fp)-(int)pos; // get current file pointer
  212. fseek(fp, (int)pos, SEEK_SET); // seek to end of file
  213. while (1==1){
  214. unsigned char a = getc(fp);
  215. if(ferror(fp)>0){
  216. break;
  217. }
  218. putc(a,outf);
  219. }*/
  220. fclose(outf);
  221. fclose(fp);
  222. }
  223.  
  224. void get(char *filepath, char *framename) {
  225. FILE *fp = fopen(filepath, "rb");
  226. struct tagHeader tag = readTagHeader(fp);
  227. //END OF TAG HEADER
  228.  
  229. int bytesReaded = 10;
  230. struct oframe frames[tag.size / 11 + 1];
  231. int i = 0;
  232.  
  233. while (tag.size > bytesReaded) {
  234. struct oframe buff = readoframe(fp, tag.size - bytesReaded);
  235. if (buff.size == 0)
  236. break;
  237.  
  238. frames[i] = buff;
  239. if (strcmp(frames[i].name, framename) == 0) {
  240. printf("%s data: ", framename);
  241. for (int j = 0; j < frames[i].size - 1; j++) {
  242. printf("%c", frames[i].content[j]);
  243. }
  244.  
  245. i++;
  246. for (int j = 0; j < buff.size; ++j) //clearing buff container
  247. buff.content[j] = 0;
  248. printf("\n");
  249. break;
  250. }
  251. //printf("%s %d ", frames[i].name, frames[i].size);
  252.  
  253. }
  254. }
  255.  
  256. void show(char *filepath) {
  257. FILE *fp = fopen(filepath, "rb");
  258. struct tagHeader tag = readTagHeader(fp);
  259. printf("%s%s%d%d%s%d\n", tag.name, " : ", tag.version[0], tag.version[1], " : ", tag.size);
  260. //END OF TAG HEADER
  261.  
  262. int bytesReaded = 10;
  263. struct oframe frames[tag.size / 11 + 1];
  264. int i = 0;
  265.  
  266. while (tag.size > bytesReaded) {
  267. struct oframe buff = readoframe(fp, tag.size - bytesReaded);
  268. if (buff.size == 0)
  269. break;
  270.  
  271. frames[i] = buff;
  272. printf("%s %d ", frames[i].name, frames[i].size);
  273. bytesReaded += 10 + frames[i].size;
  274. for (int j = 0; j < frames[i].size - 1; j++)
  275. printf("%c", frames[i].content[j]);
  276.  
  277. i++;
  278. for (int j = 0; j < buff.size; ++j) //clearing buff container
  279. buff.content[j] = 0;
  280. printf("\n");
  281.  
  282.  
  283. }
  284. //END OF FRAME
  285.  
  286. }
  287.  
  288. int main(int argc, char *argv[]) {
  289. setlocale(LC_ALL, "Rus");
  290. char* filepath;
  291. filepath = strpbrk(argv[1],"=") + 1;
  292. for (int i = 2; i < argc; i++){
  293. if (strcmp(argv[i], "--show") == 0) {
  294. show(filepath);
  295. continue;
  296. }
  297. if (strcmp(argv[i], "--get") == 0) {
  298. get(filepath, argv[i+1]);
  299. continue;
  300. }
  301. if (strcmp(argv[i], "--set") == 0) {
  302. set(filepath, argv[i+1], argv[i+2]);
  303. continue;
  304. }
  305. }
  306.  
  307. //show("test5.mp3");
  308. //get("test5.mp3", "TCOM");
  309. //set("test5.mp3", "TCON", "rap");
  310. //show("temp.mp3");
  311. return 0;
  312. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement