{ "info": { "author": "gibartes", "author_email": "", "bugtrack_url": null, "classifiers": [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9" ], "description": "\nfrom structureReader import structureReader as sr\n\nif __name__ == '__main__':\n HELP = \"\"\"\n\n << \uad6c\uc870\uccb4 >> \n\n 1. \uc0dd\uc131\uc2dc \ubc14\ub85c \uc120\uc5b8\n cs = sr.CStructure(\ud544\ub4dc \ub9ac\uc2a4\ud2b8,\ud544\ub4dc \ud06c\uae30 \ub9ac\uc2a4\ud2b8,\n {ptr=\ud544\ub4dc \ud0c0\uc785 \ub9ac\uc2a4\ud2b8(\ucc38\uc870=True, \uac12=False),arr=\ubc30\uc5f4 \ud06c\uae30, name=\uad6c\uc870\uccb4 \ubcc4\uba85})\n\n 2. \uac1d\uccb4 \uc0dd\uc131 \ud6c4 \ube4c\ub4dc (\uc5b4\ub808\uc774 \uc0dd\uc131 \uc548\ub428)\n cs = sr.CStructure()\n cs.build(\ud544\ub4dc \ub9ac\uc2a4\ud2b8,\ud544\ub4dc \ud06c\uae30 \ub9ac\uc2a4\ud2b8,{ptr=\ud544\ub4dc \ud0c0\uc785 \ub9ac\uc2a4\ud2b8(\ucc38\uc870=True, \uac12=False)})\n\n \uc608\uc81c)\n \ubaa8\ub450 \uac12\uc778 \uacbd\uc6b0 \ud544\ub4dc \ud0c0\uc785 \ub9ac\uc2a4\ud2b8\ub97c \uc0dd\ub7b5\ud574\ub3c4 \ubb34\ubc29\ud558\ub2e4.\n header = sr.CStructure([\"size\",\"flag\",\"mode\"],[4,4,4])\n \uc911\uac04\uc5d0 \ud3ec\uc778\ud130\uac00 \ud544\uc694\ud55c \uacbd\uc6b0 \ud544\ub4dc \ud0c0\uc785 \ub9ac\uc2a4\ud2b8\ub97c \ucd94\uac00\ud574\uc57c \ud55c\ub2e4. True\uc778 \uacbd\uc6b0\uac00 \ud3ec\uc778\ud130 \uac12\uc774\ub2e4.\n \ud3ec\uc778\ud130 \ubcc0\uc218\uc758 \ud06c\uae30\ub9cc\ud07c \ubc14\uc774\ub108\ub9ac\ub97c \uac74\ub108 \ub6f4\ub2e4.\n body = sr.CStructure([\"own\",\"hello\",\"world\",\"message\"],[4,4,2,0],[False,False,False,True])\n\n 3. \uc804\uccb4 \uad6c\uc870/\uac12 \uac00\uc2dc\uc801\uc73c\ub85c \ud655\uc778\ud558\uae30\n encode \uac12\uc740 \uae30\ubcf8\uc801\uc73c\ub85c None\uc774\uba70 endian\uc5d0 \ub530\ub77c \uc815\uc218\uac12\uc73c\ub85c \ubcc0\ud658\ud558\uc5ec \ucd9c\ub825\ud55c\ub2e4.\n sr.print(endian='system_endian',encode=None)\n\n 4. \uad6c\uc870\uccb4 \ud06c\uae30 \ud655\uc778\ud558\uae30\n cs.sizeof()\n \ud06c\uae30\uac00 \uc9c0\uc815\ub418\uc9c0 \uc54a\uc740 \ud3ec\uc778\ud130 \uac12\uc740 \ud06c\uae30\uc5d0\uc11c \uc81c\uc678\ub41c\ub2e4.\n\n 5. \uad6c\uc870\uccb4 \uc704\uce58 \uc62e\uae30\uae30\n cs.move_head(offset)\n \uad6c\uc870\uccb4 \uc804\uccb4 \uc704\uce58\ub97c offset\ub9cc\ud07c \uc774\ub3d9\uc2dc\ud0a8\ub2e4.\n\n 6. \uad6c\uc870\uccb4 \ud2b9\uc815 \ud544\ub4dc \ud06c\uae30 \ubcc0\uacbd\ud558\uae30\n cs.extent(field,size)\n field\ub294 \ud06c\uae30\ub97c \ubcc0\uacbd\ud560 \uac12\uc774\uace0, size\ub294 \ubcc0\uacbd\ud560 \ud06c\uae30\uc774\ub2e4.\n \ubcf5\ud569 \uad6c\uc870\uccb4 \ub0b4\uc5d0 \uc0ac\uc6a9\ud560 \ub54c\ub294 CStructure\uc758 \ud3ec\uc778\ud130 \ud615\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 \uac83\uc744 \uad8c\uc7a5\ud55c\ub2e4.\n\n 7. \uad6c\uc870\uccb4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ubc14\uc774\ub108\ub9ac \uac12 \ucd94\ucd9c\ud558\uae30\n new_binary = cs.bin\n \ud3ec\uc778\ud130 \uad6c\uc870\uccb4\ub97c \uc81c\uc678\ud55c \ub098\uba38\uc9c0 \ud544\ub4dc\ub4e4\uc774 \uac00\uc9c4 \uac12\ub4e4\uc744 \uc21c\uc11c\ub300\ub85c \ubc14\uc774\ub108\ub9ac \uac12\uc73c\ub85c \ucd9c\ub825\ud55c\ub2e4.\n\n 8. \uad6c\uc870\uccb4 \ubcf5\uc0ac\ud558\uae30\n 1. \ud604\uc7ac \uad6c\uc870\uccb4 (\ud615\ud0dc/\uac12) \ubcf5\uc0ac\n new = cs.copy()\n\n 2. \ub2e4\ub978 \uad6c\uc870\uccb4\ub85c\ubd80\ud130 \ubcf5\uc0ac\n \ud615\ud0dc/\uac12 \ubcf5\uc0ac:\n new = sr.CStructure()\n new.copy(cs,CStructure.ByValue)\n \ud615\ud0dc/\ucc38\uc870 \ubcf5\uc0ac:\n new = sr.CStructure()\n new.copy(cs,CStructure.ByRef)\n\n 9.\uad6c\uc870\uccb4 \ud2b9\uc815 \ud544\ub4dc\uc5d0 \ub370\uc774\ud130 \ucd94\ucd9c\ud558\uae30\n 1. >> \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud55c\ub2e4.\n return \uc778\uc790\ub97c \uba85\uc2dc\ud55c \uacbd\uc6b0, ret\uc5d0 \ud544\ub4dc \ub370\uc774\ud130\uac00 \uc800\uc7a5\ub41c\ub2e4.\n cs >> (field, ret)\n \uc2e4\ud589\ubb38\uc758 \uacb0\uacfc\ub294 ret\uacfc \uac19\ub2e4. \uc989,\n a = cs >> (field,ret)\n \uc774\uba74 a == ret \uc774\ub2e4.\n\n return \uc778\uc790\uac00 \uc5c6\ub294 \uacbd\uc6b0\n cs >> (field,)\n \uc2e4\ud589\ubb38\uc758 \uacb0\uacfc\ub294 \ud544\ub4dc\uc5d0 \uc788\ub294 \ub370\uc774\ud130 \uac12\uc774\ub2e4.\n\n \uc608\uc81c)\n signature \ud544\ub4dc \uac12 \ucd94\ucd9c \n cs >> (\"signature\",)\n\n 2. - \uc5f0\uc0b0\uc790\ub97c \ud1b5\ud574 \uac12\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub2e4. \uc774 \uc5f0\uc0b0\uc790\ub294 \uc77d\uae30 \uc804\uc6a9\uc774\ub2e4.\n \uc608\uc81c)\n cs-\"signature\"\n\n 10. \uad6c\uc870\uccb4 \ub370\uc774\ud130 \uc218\uc815\ud558\uae30\n << \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud55c\ub2e4.\n\n \ubc14\uc774\ub108\ub9ac \ub370\uc774\ud130\uc758 \uacbd\uc6b0\n cs << binary\n \ub85c \uc785\ub825\uc744 \ud560 \uc218 \uc788\ub2e4. \ubc14\uc774\ub108\ub9ac \uac12\uc744 \ub123\uc5b4\uc8fc\uba74 \ud06c\uae30\ub9cc\ud07c \uc54c\uc544\uc11c \ud544\ub4dc\uc5d0 \ub123\uc5b4\uc900\ub2e4. \uc5d4\ub514\uc548\uc744 \uace0\ub824\ud558\uc9c0 \uc54a\ub294\ub2e4.\n\n \ud2b9\uc815 \ud544\ub4dc\uc5d0 \ud2b9\uc815 \uac12\uc744 \uc0bd\uc785\ud558\ub294 \uacbd\uc6b0\n cs << (field, value)\n \ub85c \uac12\uc744 \uc218\uc815\ud560 \uc218 \uc788\ub2e4.\n\n \uc608\uc81c)\n cs << (\"signature\",b'FILE')\n\n \uc5d4\ub514\uc548\uc744 \uace0\ub824\ud574\uc57c\ud558\ub294 \uacbd\uc6b0 << \uc624\ud37c\ub808\uc774\ud130\uc5d0 \uc778\uc790\ub97c 3\uac1c \uc900\ub2e4.\n \uae30\ubcf8\uc801\uc73c\ub85c \uc2dc\uc2a4\ud15c \uc5d4\ub514\uc548\uc774\uba70, little, big\uc744 \uc778\uc790\ub85c \uc904 \uc218 \uc788\ub2e4.\n \ub9cc\uc77c \ubc14\uc774\ud2b8 \uae38\uc774\uac00 \ud2b9\uc815 \ud544\ub4dc \uae38\uc774\uc5d0 \ube44\ud574 \uc9e7\uc73c\uba74 \uc5d4\ub514\uc548 \uc0c1\uc704\ubc14\uc774\ud2b8\ub85c\ubd80\ud130 \ud328\ub529 \ubc14\uc774\ud2b8\uac00 \ucd94\uac00\ub41c\ub2e4. \n\n \uc608\uc81c)\n cs << (\"signature\",0x100,CStructure.LITTLE)\n\n 11.\uad6c\uc870\uccb4\uc758 \ud3ec\uc778\ud130 \ud544\ub4dc\uc5d0 \ub370\uc774\ud130 \uc218\uc815\ud558\uae30\n < \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud55c\ub2e4.\n cs < (ptr_field, new)\n\n 12. \uae30\ud0c0 \uc81c\uacf5 \uae30\ub2a5\n 1.) \ubc14\uc774\ud2b8->\uc815\uc218 \uc804\ud658\n CStructure.byte2int(binary,endian=system)\n Binary \ud615\uc2dd\uc758 \ub370\uc774\ud130\ub97c endian\uc5d0 \ub530\ub77c \uc815\uc218\uac12\uc73c\ub85c \ubcc0\ud658\ud55c\ub2e4.\n \uc774 \uba54\uc18c\ub4dc\ub294 static\uc774\ubbc0\ub85c \uac1d\uccb4\ub97c \uc120\uc5b8\ud560 \ud544\uc694\uac00 \uc5c6\ub2e4.\n 2.) \uc815\ub82c \ud328\ub529 \uacc4\uc0b0\n CStructure.align(data,aligned)\n data\uc5d0\uc11c aligned\ub9cc\ud07c \ub370\uc774\ud130 \uc815\ub82c\ud558\uae30 \uc704\ud574 \ud544\uc694\ud55c \ud328\ub529 \ubc14\uc774\ud2b8 \uc218\ub97c \uad6c\ud55c\ub2e4.\n \uc774 \uba54\uc18c\ub4dc\ub294 static\uc774\ubbc0\ub85c \uac1d\uccb4\ub97c \uc120\uc5b8\ud560 \ud544\uc694\uac00 \uc5c6\ub2e4.\n 3.) \uc544\uc2a4\ud0a4->\uc815\uc218 \ubcc0\ud658\n CStructure.ascii2int(ascii,base=8)\n \uc544\uc2a4\ud0a4 \ucf54\ub4dc\ub85c \uc801\ud600\uc838 \uc788\ub294 \"\uc22b\uc790\ub4e4\"\uc744 base\ub97c \uc9c4\uc218\ub85c\ud558\ub294 \uc815\uc218\ub85c \ubcc0\ud658\ud55c\ub2e4.\n \uc774 \uba54\uc18c\ub4dc\ub294 static\uc774\ubbc0\ub85c \uac1d\uccb4\ub97c \uc120\uc5b8\ud560 \ud544\uc694\uac00 \uc5c6\ub2e4.\n\n << \ubcf5\ud569 \uad6c\uc870\uccb4 >>\n\n 1. \uc0dd\uc131\uc2dc \ubc14\ub85c \uc120\uc5b8\n cu = sr.CUnion([\n [\ud544\ub4dc \uc774\ub984#1,\uad6c\uc870\uccb4#1],\n [\ud544\ub4dc \uc774\ub984#2,\uad6c\uc870\uccb4#2],\n ],arr=\ubc30\uc5f4 \ud06c\uae30, name=\ubcf5\ud569 \uad6c\uc870\uccb4 \ubcc4\uba85)\n\n \ubcf5\ud569 \uad6c\uc870\uccb4\uc5d0\uc11c \ud2b9\uc815 \ud544\ub4dc\uc758 \uc624\ud504\uc14b\uc744 \ubcc0\uacbd\ud558\ub824\uba74 movefrom(field,offset) \ud568\uc218\ub97c \uc0ac\uc6a9\ud55c\ub2e4.\n movefrom \ud568\uc218\ub97c \ud638\ucd9c\ud558\uac8c \ub418\uba74 \ud574\ub2f9 \ud544\ub4dc \uc774\ud6c4\uc758 \ubaa8\ub4e0 \ud544\ub4dc\ub294 offset\ub9cc\ud07c \uc6c0\uc9c1\uc778\ub2e4. (\uc0c1\ub300 \uc704\uce58)\n\n \uc608\uc81c)\n cu = sr.CUnion(\n [\n [\"header\" ,header],\n [\"body\" ,body ],\n [\"trailer\",footer],\n ],3\n )\n\n 2. \uc804\uccb4 \uad6c\uc870/\uac12 \uac00\uc2dc\uc801\uc73c\ub85c \ud655\uc778\ud558\uae30\n encode \uac12\uc740 \uae30\ubcf8\uc801\uc73c\ub85c None\uc774\uba70 endian\uc5d0 \ub530\ub77c \uc815\uc218\uac12\uc73c\ub85c \ubcc0\ud658\ud558\uc5ec \ucd9c\ub825\ud55c\ub2e4.\n cu.pprint(endian=system_endian,encode=None)\n\n 3. \ubcf5\ud569 \uad6c\uc870\uccb4 \ud06c\uae30 \ud655\uc778\ud558\uae30\n cu.sizeof()\n CUnion \ub0b4\ubd80\uc5d0 \uc788\ub294 CStruture \ub0b4\uc5d0 \ud06c\uae30\uac00 \uc9c0\uc815\ub418\uc9c0 \uc54a\uc740 \ud3ec\uc778\ud130 \uac12\uc740 \ud06c\uae30\uc5d0\uc11c \uc81c\uc678\ub41c\ub2e4.\n\n 4. \ubcf5\ud569 \uad6c\uc870\uccb4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ubc14\uc774\ub108\ub9ac \uac12 \ucd94\ucd9c\ud558\uae30\n new_binary = cu.bin\n \ud3ec\uc778\ud130 \uad6c\uc870\uccb4\ub97c \uc81c\uc678\ud55c \ub098\uba38\uc9c0 \ud544\ub4dc\ub4e4\uc774 \uac00\uc9c4 \uac12\ub4e4\uc744 \uc21c\uc11c\ub300\ub85c \ubc14\uc774\ub108\ub9ac \uac12\uc73c\ub85c \ucd9c\ub825\ud55c\ub2e4.\n\n 5. \ubcf5\ud569 \uad6c\uc870\uccb4 \ubcf5\uc0ac\ud558\uae30\n \ub2e4\ub978 \ubcf5\ud569 \uad6c\uc870\uccb4(CUnion)\uc640\ub9cc \uc0c1\ud638\uc791\uc6a9\ud55c\ub2e4. CStrucutre\uc640 \ud638\ud658\uc774 \ub418\uc9c0 \uc54a\ub294\ub2e4.\n 1. \ud604\uc7ac \uad6c\uc870\uccb4 (\ud615\ud0dc/\uac12) \ubcf5\uc0ac\n new = cu.copy()\n\n 2. \ub2e4\ub978 \uad6c\uc870\uccb4\ub85c\ubd80\ud130 \ubcf5\uc0ac\n \ud615\ud0dc \ubcf5\uc0ac:\n new = sr.CUnion()\n new.copy(cs,CStructure.ByValue)\n \ud615\ud0dc/\ucc38\uc870 \ubcf5\uc0ac:\n new = sr.CUnion()\n new.copy(cs,CStructure.ByRef)\n\n 6. \uad6c\uc870\uccb4\uac00 \uac00\uc9c0\uace0 \uc788\ub294 \ubc14\uc774\ub108\ub9ac \uac12 \ucd94\ucd9c\ud558\uae30\n new_binary = cu.bin \ud639\uc740 cu.data\n \ub0b4\ubd80\uc758 \ud3ec\uc778\ud130 \uad6c\uc870\uccb4\ub97c \uc81c\uc678\ud55c \ub098\uba38\uc9c0 \ud544\ub4dc\ub4e4\uc774 \uac00\uc9c4 \uac12\ub4e4\uc744 \uc21c\uc11c\ub300\ub85c \ubc14\uc774\ub108\ub9ac \uac12\uc73c\ub85c \ucd9c\ub825\ud55c\ub2e4.\n\n 7. \ubcf5\ud569 \uad6c\uc870\uccb4 \ud2b9\uc815 \ud544\ub4dc\uc5d0 \ub370\uc774\ud130 \ucd94\ucd9c\ud558\uae30\n 1. >> \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud55c\ub2e4.\n return \uc778\uc790\ub97c \uba85\uc2dc\ud55c \uacbd\uc6b0, ret\uc5d0 \ud544\ub4dc \ub370\uc774\ud130\uac00 \uc800\uc7a5\ub41c\ub2e4.\n cu >> (field, ret)\n \uc2e4\ud589\ubb38\uc758 \uacb0\uacfc\ub294 ret\uacfc \uac19\ub2e4. \uc989,\n a = cu >> (field,ret)\n \uc774\uba74 a == ret \uc774\ub2e4. \uc774 \uacbd\uc6b0 \uac12\uc5d0 \ub300\ud55c \ud638\ucd9c\uc774\ub2e4.\n \ub9ac\ud134 \uac12\uc740 CUnion, CStructure, Value \uc774\ub2e4.\n\n return \uc778\uc790\uac00 \uc5c6\ub294 \uacbd\uc6b0\n cu >> (field,)\n \uc2e4\ud589\ubb38\uc758 \uacb0\uacfc\ub294 \ud544\ub4dc\uc5d0 \uc788\ub294 \ub370\uc774\ud130 \uac12\uc774\uba70 \uac12\uc5d0 \ub300\ud55c \ud638\ucd9c\uc774\ub2e4.\n \ub9ac\ud134 \uac12\uc740 CUnion, CStructure, Value \uc774\ub2e4.\n\n \ub9cc\uc77c \uac1d\uccb4 \ub0b4\uc758 \ub370\uc774\ud130\ub97c \uc218\uc815\ud558\uace0 \uc774\ub97c \ud604 \ubcf5\ud569 \uad6c\uc870\uccb4\uc5d0 \ubc18\uc601\ud558\uace0 \uc2f6\ub2e4\uba74 \ucc38\uc870\uc5d0 \uc758\ud55c \ud638\ucd9c\uc744 \uc0ac\uc6a9\ud55c\ub2e4. \n \ub450\ubc88\uc9f8 \uc778\uc790\uac00 True\uc774\uba74 \uc8fc\uba74 \ucc38\uc870\uc5d0 \uc758\ud55c \ud638\ucd9c\uc774\ub2e4.\n cu >> (field,True)\n\n \uc608\uc81c)\n CU \ubcf5\ud569 \uad6c\uc870\uccb4 \ub0b4\uc5d0 \uc788\ub294 header \uad6c\uc870\uccb4\ub97c \uad6c\uc131\ud558\ub294 \ud544\ub4dc \uc911 signature \uac12\uc5d0 \ub300\ud55c \ud638\ucd9c\n cu >> (\"header\",) >> (\"signature\",))\n CU \ubcf5\ud569 \uad6c\uc870\uccb4 \ub0b4\uc5d0 \uc788\ub294 body \uad6c\uc870\uccb4\ub97c \uad6c\uc131\ud558\ub294 \ud544\ub4dc \uc911 contents_header \uad6c\uc870\uccb4\uc5d0 \ub300\ud55c \ucc38\uc870\uc5d0 \uc758\ud55c \ud638\ucd9c\n cu >> (\"body\",True) >> (\"contents_header\",True)\n\n 2. - \uc5f0\uc0b0\uc790\ub97c \ud1b5\ud574 \uac12\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub2e4. \uc774 \uc5f0\uc0b0\uc790\ub294 \uc77d\uae30 \uc804\uc6a9\uc774\ub2e4.\n cs-\"header\"-\"signature\"\n\n 8. \ubcf5\ud569 \uad6c\uc870\uccb4 \ub370\uc774\ud130 \uc218\uc815\ud558\uae30\n << \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud55c\ub2e4.\n\n \ubc14\uc774\ub108\ub9ac \ub370\uc774\ud130\uc758 \uacbd\uc6b0\n cu << binary\n \ub85c \uc785\ub825\uc744 \ud560 \uc218 \uc788\ub2e4. \ubc14\uc774\ub108\ub9ac \uac12\uc744 \ub123\uc5b4\uc8fc\uba74 \ud06c\uae30\ub9cc\ud07c \uc54c\uc544\uc11c \ud544\ub4dc\uc5d0 \ub123\uc5b4\uc900\ub2e4.\n\n \ubcf5\ud569 \uad6c\uc870\uccb4 \ud2b9\uc815 \ud544\ub4dc\uc5d0 \ub370\uc774\ud130 \uc218\uc815\ud558\ub294 \uacbd\uc6b0\n \uc6d0\ud558\ub294 \ud544\ub4dc\uc5d0 \ub370\uc774\ud130\ub97c \uc218\uc815\ud558\uae30 \uc704\ud574\uc11c\ub294 \uac12\uc5d0 \uc758\ud55c \ud638\ucd9c\uc774 \uc544\ub2c8\ub77c \ucc38\uc870\uc5d0 \uc758\ud55c \ud638\ucd9c\uc774\uc5b4\uc57c \ud55c\ub2e4.\n \uac12\uc774 \uc544\ub2c8\ub354\ub77c\ub3c4, CStructure\ub098 CUnion \ud544\ub4dc\uc5d0\uc11c\ub3c4 \ud06c\uae30\uac00 \ub3d9\uc77c\ud55c CStructure\ub098 CUnion\uc774\uba74 \uc218\uc815 \ud5c8\uc6a9\ud55c\ub2e4.\n\n \uc608\uc81c)\n CU \ubcf5\ud569 \uad6c\uc870\uccb4 \ub0b4\uc5d0 \uc788\ub294 header \uad6c\uc870\uccb4\ub97c \uad6c\uc131\ud558\ub294 \ud544\ub4dc \uc911 signature \uac12\uc744 b'FILE'\ub85c \uc218\uc815\n cu >> (\"header\",True) << (\"signature\",b'FILE')\n\n 9. \ubcf5\ud569 \uad6c\uc870\uccb4\uc5d0\uc11c\uc758 \ud3ec\uc778\ud130 \ud544\ub4dc\n \ubcf5\ud569 \uad6c\uc870\uccb4\uc5d0\uc11c\ub294 \ud3ec\uc778\ud130 \ud544\ub4dc\uac00 \uc5c6\uc73c\ubbc0\ub85c \ud3ec\uc778\ud130 \ud544\ub4dc\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574\uc11c\ub294 \n CStructure\ub97c \uc0ac\uc6a9\ud574\uc11c CStructure \ub0b4\uc5d0 \ud3ec\uc778\ud130 \ud544\ub4dc\ub97c \uc0bd\uc785\ud574\uc57c \ud55c\ub2e4.\n\n \uc608\uc81c)\n CU \ubcf5\ud569 \uad6c\uc870\uccb4 \ub0b4\uc5d0 \uc788\ub294 body \uad6c\uc870\uccb4\ub97c \uad6c\uc131\ud558\ub294 \ud544\ub4dc \uc911 contents \ud3ec\uc778\ud130 \uad6c\uc870\uccb4\uc5d0 \ub300\ud55c \ucc38\uc870\uc5d0 \uc758\ud55c \ud638\ucd9c\n cu >> (\"body\",True) < (\"contents\",sth_binary_data)\n\n 10. lazy \uae30\ub2a5\n \ub370\uc774\ud130\ub97c \ubd84\uc11d\ud558\ub294 \uac83\ubcf4\ub2e4 \ub370\uc774\ud130\ub97c \ubcf4\uc720\ud558\uace0 \uc788\ub294 \uac83\uc774 \uc911\uc694\ud560 \ub54c\uac00 \uc788\ub2e4. \n \uc774 \uacbd\uc6b0 lazy \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud568\uc73c\ub85c\uc368 \uad6c\uc870\ub97c \ub0b4\ubd80\uc5d0 \uc785\ub825\ud558\uc9c0 \uc54a\uace0 \uc9c0\ub098\uac00\uac8c \ud558\uc5ec \uc18d\ub3c4\ub97c \ud5a5\uc0c1\uc2dc\ud0ac \uc218 \uc788\ub2e4.\n wake\ub97c \ud638\ucd9c\ud558\uba74 lazy \uac12\uc740 \ucd08\uae30\ud654\ub418\uace0 \ub0b4\ubd80\uc5d0 \ub370\uc774\ud130\ub97c \uc785\ub825\ud55c\ub2e4.\n\n \uc608\uc81c)\n \ubcf4\uad00: cu.lazy = sth_binary_data\n \uc0ac\uc6a9: cu.wake()\n\n\n << \uad6c\uc870\uccb4\uc640 \ubcf5\ud569 \uad6c\uc870\uccb4 \uc0dd\uc131 \uac04\ub2e8\ud788 \ud558\uae30 >>\n\n cref \uac1d\uccb4\ub97c \uc774\uc6a9\ud558\uba74 CStructure\ub098 CUnion \uac1d\uccb4\ub97c \uc0dd\uc131\ud560 \ub54c \ub9e4\ubc88 \uad6c\uc870 \uc778\uc790\ub97c \uc904 \ud544\uc694 \uc5c6\uc774 \uac1d\uccb4 \uc0dd\uc131\uc774 \uac00\ub2a5\ud558\ub2e4.\n \ud574\ub2f9 \uad6c\uc870\uccb4\uac00 \ubbf8\ub9ac \uc815\uc758\ub418\uace0 \ucc38\uc870\ub418\uc5b4\uc57c\ud558\uc9c0 \uc54a\uc73c\uba70, \ud30c\uc774\uc36c \ud638\ucd9c \ubc29\uc2dd\uc5d0 \uc775\uc219\ud558\uc9c0 \uc54a\uc73c\uba74 \n cref\ub85c \uac1d\uccb4\ub97c \uc0dd\uc131\ud558\ub294 \uac83\uc744 \uad8c\uc7a5\ud55c\ub2e4.\n\n cref\ub97c \uc774\uc6a9\ud574 \uad6c\uc870\uccb4 \uac1d\uccb4 \uc0dd\uc131 \ubc29\ubc95\n\n 1. cref \uac1d\uccb4 \uc120\uc5b8 \ubc0f \ud30c\ub77c\ubbf8\ud130 \uc124\uc815\n p = sr.cref(list of Fields,list of Sizes,list of Pointers,list of CStructures,name)\n cref \uac1d\uccb4 \uc0dd\uc131\uc2dc \ubaa9\uc801\uc5d0 \ub9de\uac8c \ud30c\ub77c\ubbf8\ud130\ub97c \uc8fc\uba74 \ub41c\ub2e4.\n\n cref\uc758 \uac1d\uccb4 \uba54\uc18c\ub4dc\uc778 args\ub97c \uc774\uc6a9\ud574 \ub0b4\ubd80 \ud56d\ubaa9\uc744 \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4.\n p.args(list of Fields,list of Sizes,list of Pointers,list of CStructures,name)\n \ubcc0\uacbd\ud558\uc9c0 \uc54a\uc744 \ud30c\ub77c\ubbf8\ud130\uc5d0\ub294 None\uac12\uc744 \uc8fc\uba74 \ub41c\ub2e4.\n\n \uc608\uc81c)\n s = sr.cref([\"hdr\",\"nxt_off\",\"mlen\",\"message\"],[8,8,4,0],[False,False,False,True],None,\"content\")\n\n cref\uc5d0\ub294 dictionary\ub85c \uad6c\uc870\uccb4\ub97c \uc0dd\uc131\ud558\ub294 \ubc29\ubc95\uc744 \uc81c\uacf5\ud55c\ub2e4. \n dictionary\ub294 \uc21c\uc11c \uc815\ub82c\ub41c OrderedDict\uc774\uc5b4\uc57c \ud558\uba70, \ub2e4\uc74c\ucc98\ub7fc \uad6c\uc131\ub418\uc5b4\uc57c \ud55c\ub2e4.\n dictionary=OrderedDict({\"str_field\":[int_size,bool_ptr],})\n\n p.from_dict(types,dictionary)\ub97c \uc774\uc6a9\ud574\uc11c dictionary\ub85c\ubd80\ud130 \uad6c\uc870\uccb4\ub97c \uc0dd\uc131\ud55c\ub2e4.\n \uc5ec\uae30\uc11c types\ub77c\ub294 \uc0dd\uc131 \uacb0\uacfc\ubb3c \ud615\uc2dd\uc774\ub2e4.\n types\uac00 cref.structure\uc774\ub77c\uba74 cref \uac1d\uccb4\ub294 CStructure \uac1d\uccb4\ub97c \uc0dd\uc131\ud558\uace0,\n cref.union\uc774\ub77c\uba74 cref \uac1d\uccb4\ub294 CUnion \uac1d\uccb4\ub97c \uc0dd\uc131\ud55c\ub2e4.\n\n 2. cref\ub97c \uc774\uc6a9\ud574 CStructure, CUnion \uc0dd\uc131\ud558\uae30\n \uc120\uc5b8\ub41c cref \uac1d\uccb4\ub97c \uc774\uc6a9\ud574 CStructure\uc640 CUnion\uc744 \uc0dd\uc131\ud558\ub824\uba74 g \uba54\uc18c\ub4dc\uc640 generate\uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud558\uba74 \ub41c\ub2e4. \n generate \uba54\uc18c\ub4dc\ub294 pobject \ud568\uc218\uc758 \uae34-\uc774\ub984 \ub808\ud37c \uba54\uc18c\ub4dc\uc774\ub2e4.\n\n \uc0ac\uc6a9\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. \n p.pobject(types,arr=None,name=None)\n\n types: \uc0b0\ucd9c\ubb3c \ud615\uc2dd\uc744 \uc9c0\uc815\ud55c\ub2e4.\n 1. cref.structure\uc774\ub77c\uba74 cref \uac1d\uccb4\ub294 CStructure \uac1d\uccb4\ub97c \uc0dd\uc131\ud55c\ub2e4.\n 2. cref.union\uc774\ub77c\uba74 cref \uac1d\uccb4\ub294 CUnion \uac1d\uccb4\ub97c \uc0dd\uc131\ud55c\ub2e4.\n arr : \uc5b4\ub808\uc774 \ud615\uc2dd\uc758 \uac1d\uccb4\ub97c \uc0dd\uc131\ud55c\ub2e4. arr\uc5d0 \uc591\uc758 \uc815\uc218\ub97c \uc785\ub825\ud558\uba74 \n CStructure[arr]\uac00 \uc0dd\uc131\ub41c\ub2e4.\n name : CStructure, CUnion \uc124\uc815\ud55c\ub2e4. \ud06c\uae30\uac00 \ud070 \ud504\ub85c\uc81d\ud2b8\uc758 \uacbd\uc6b0 \uad6c\ubd84\uc744 \uc704\ud574 \uad6c\uc870\uccb4 \uc774\ub984\uc744 \uc9c0\uc815\ud574\ub450\ub294 \uac83\uc774 \uc88b\ub2e4.\n \uac1d\uccb4 \uc0dd\uc131\uc2dc\uc758 name\uacfc \ub2ec\ub9ac \ud55c\ubc88\ub9cc \uc0ac\uc6a9\ud55c\ub2e4.\n\n g\uba54\uc18c\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0 << \uc5f0\uc0b0\uc790\ub97c \uc774\uc6a9\ud574\uc11c \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4. \uc774 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud558\uba74 1 line \uac1d\uccb4 \uc0dd\uc131\uc774 \uac00\ub2a5\ud558\ub2e4.\n\n 1. CStructure/CUnion = p << types\n 2. CStructure/CUnion = p << (types,arr)\n 3. CStructure/CUnion = p << (types,arr,name)\n 4. CStructure/CUnion = sr.cref(list of Fields,list of Sizes,list of Pointers,list of CStructures,name) << types\n\n 3. Primitive\ub77c\uba74 INTEGER.default(types)\ub97c \uc774\uc6a9\ud574\uc11c \uc0dd\uc131\ud558\uba74 \uac04\ub2e8\ud558\ub2e4.\n \uc9c0\uc6d0\ud558\ub294 Primitive\ub294 int8, int16, int32, int64\uc758 4\uac1c \uc885\ub958\uc774\ub2e4.\n Primitive\ub294 1\uac1c\uc758 \ud544\ub4dc\ub97c \uac00\uc9c4 CStructure \ud615\uc2dd\uc73c\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\ub2e4.\n\n _int32 = sr.INTEGERS.default(\"int32\")\n\n 4. C \uad6c\uc870\uccb4 \uc0dd\uc131 \ubc29\ubc95\n cref \uac1d\uccb4\ub85c \ub3d9\uc801\uc73c\ub85c C-\uad6c\uc870\uccb4\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\ub2e4. \n\n cstyle = cref()\n\n cref \uac1d\uccb4\ub97c \uc0dd\uc131\ud588\uc73c\uba74 push\uc640 pusha \ud568\uc218\ub85c \ud544\ub4dc\ub97c \uc9c0\uc815\ud574\uc11c \ub123\uc744 \uc218 \uc788\ub2e4. push\uc5d0\ub294 \ud544\ub4dc\uc774\ub984\uacfc \ud544\ub4dc \ud0c0\uc785\uc774 \uc778\uc790\ub85c \ub4e4\uc5b4\uac00\uba70,\n pusha\uc5d0\uc11c\ub294 \ud544\ub4dc \uc774\ub984\uacfc \ud0c0\uc785\uc774 \uc21c\uc368\uc30d\uc73c\ub85c \ubb36\uc778 OrderedDict \ub098, \ud544\ub4dc \uc774\ub984 \ub9ac\uc2a4\ud2b8, \ud544\ub4dc \ud0c0\uc785 \ub9ac\uc2a4\ud2b8\uc758 2\uac1c \uc778\uc790\ub97c \ubc1b\ub294\ub2e4.\n\n cstyle.pusha(OrderedDict{\"signature\":c_uint32,\"size\":c_uint32,\"flag\":c_uint16})\n \ud639\uc740\n cstyle.pusha([\"signature\",\"size\",\"flag][c_uint32,c_uint32,c_uint16])\n\n \ud544\ub4dc\ub97c \uc804\ubd80 \uc0bd\uc785\ud588\ub2e4\uba74, csytle.build(name=str)\uc744 \ud1b5\ud574 \uad6c\uc870\uccb4 \uac1d\uccb4\ub97c \ube4c\ub4dc\ud55c\ub2e4. name\uc5d0\ub294 \ubc18\ub4dc\uc2dc \uad6c\uc870\uccb4 \uc774\ub984\uc774 \ub4e4\uc5b4\uac00\uc57c \ud55c\ub2e4.\n build \ub420 \ub54c \uc720\ud6a8\ud558\uc9c0 \uc54a\ub294 C \ud615\uc2dd \uac1c\uccb4\uc774\uba74 \ubaa9\ub85d\uc5d0\uc11c \uc81c\uc678\ub41c\ub2e4. build\ub97c \uc218\ud589\ud558\uac8c \ub418\uba74 \uad6c\uc870\uccb4 \uac1d\uccb4\ub97c \ud615\uc131\ud558\uae30\ub294 \ud558\uc9c0\ub9cc \n \uad6c\uc870\uccb4 \uc790\uccb4\ub97c \ubc18\ud658\ud558\uc9c0\ub294 \uc54a\ub294\ub2e4. \uc0dd\uc131\ub41c \uad6c\uc870\uccb4\ub97c \uc0ac\uc6a9\ud558\ub824\uba74, cstyle.cobject\ub97c \ud638\ucd9c\ud558\uc5ec \uad6c\uc870\uccb4 \uac1d\uccb4\ub97c \ubc1b\ub294\ub2e4.\n\n cobj = cstyle.cobjet\n\n \uc815\uc0c1\uc801\uc73c\ub85c \ube4c\ub4dc\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud558\ub824\uba74 print_field\ub97c \ud638\ucd9c\ud558\uc5ec \ud655\uc778\ud558\uba74 \ub41c\ub2e4. \ubb3c\ub860, \uc785\ub825 \uae38\uc774\uc640 \ucd9c\ub825 \uae38\uc774 \uac80\uc0ac\ub85c\ub3c4 \uc218\ud589\ud560 \uc218 \uc788\ub2e4.\n\n cref.print_field()\n\n cref\uc758 C-\uad6c\uc870\uccb4\ub294 Python\uacfc C/C++\uc640 \ud638\ud658\uc131\uc744 \uc704\ud574 \ub9cc\ub4e0 \uad6c\uc870\uccb4\ub85c, \uc628\uc804\ud788 Python\uc5d0\uc11c \uc27d\uac8c \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c CStructure\uc640 CUnion \uac1d\uccb4\uc640 \ud638\ud658\ub418\uc9c0 \uc54a\ub294\ub2e4.\n \ub2e4\ub9cc, \uad6c\uc870\uccb4\uc758 \ubc14\uc774\ub108\ub9ac \uac12\ub9cc \ucd94\ucd9c\ud574\uc11c CStructure/CUnion\uc5d0 \uc0bd\uc785\ud560 \uc218\ub294 \uc788\ub2e4.\n\n \"\"\"\n\n header = sr.cref([\"size\",\"flag\",\"mode\"],[4,4,4])\n\n \"\"\" body contains exactly 1 pointer value. \"\"\"\n body = sr.cref([\"nxt_off\",\"mlen\",\"message\"],[8,8,0],[False,False,True],None,\"content\")\n\n p_content = sr.cref([\"id\",\"text\"],[8,0],None,None) << sr.cref.structure\n\n \"\"\"\n The above statment directly returns CStructure.\n\n Of course, you can also do this job like: \n p_content = sr.CStructure([\"hdr\",\"hdr_size\",\"nocontent\"],[4,4,4])\n\n \"\"\"\n\n taghdr = sr.cref([\"tag\",\"content\"],None,None,[\n sr.INTEGERS.default(\"int64\"),\n body<>\")\n sbo_test[0].pprint()\n input(\"Please enter key and then go to the next stage.\")\n\n print(\"<< Data input >>\")\n sbo_test[0]<>\")\n sbo_test[0]>>(\"header\",True)<<(\"size\",0x100)\n sbo_test[0].pprint()\n input(\"Please enter key and then go to the next stage.\")\n\n print(\"\\n[*] Pointer\\n\")\n p_content<<(\"id\",0xdeadbeef)\n p_content<<(\"text\",test_buffer)\n p_content.print()\n\n input(\"Please enter key and then go to the next stage.\")\n\n print(\"\\n[*] Pointer: Extension\\n\")\n # Think as a malloc process\n p_content.extent(\"text\",len(test_buffer))\n p_content<<(\"text\",test_buffer)\n\n sbo_test[0]>>(\"body\",True)<(\"message\",p_content) \n sbo_test[0]>>(\"body\",True)<<(\"mlen\",len(test_buffer))\n (sbo_test[0]>>(\"body\",)>>(\"message\",)).print(encode='utf-8')\n\n print(\"\\nOverall Status:\")\n print(\"structure size (except for pointer structure) : \",sbo_test[0].sizeof())\n print(\"data size: {0}\\ndata info:\\n{1}\".format(len(sbo_test[0].bin),sbo_test[0].bin))\n print(\"\\n\")\n sbo_test[0].pprint()\n print(\"\\nYou can also check structure type with status()\\n\")\n sbo_test[0].status()\n\n input(\"Please enter key and then go to the next stage.\")\n\n print(\"\\n[*] Pointer: Free\\n\")\n # Think as a free process\n sbo_test[0]>>(\"body\",True)<(\"message\",sr.NULL())\n del p_content\n\n sbo_test[0].pprint()\n\n input(\"Please enter key and then go to the next stage.\")\n\n print(\"\\n[*] move fields\\n\")\n sbo_test[0].movefrom(\"pheader\",0x40)\n sbo_test[0]<>(\"pheader\",True)>>(\"content\",True)<<(\"nxt_off\",0x100)\n sbo_test[0].pprint()\n\n input(\"Please enter key and then go to the next stage.\")\n print(\"\\n[*] Call by value : The value is not changed.\\n\")\n sbo_test[0]>>(\"pheader\",True)>>(\"content\",False)<<(\"nxt_off\",0x80)\n sbo_test[0].pprint()\n\n input(\"Please enter key and then go to the next stage.\")\n\n print(\"--MFT--\")\n mft = sr._MFTEntryHeader() # Predefined mft-entry-header\n mft_entry_builder = sr.cref(name=\"mft_entry_header\")\n mft_entry_builder.from_dict(sr.cref.structure,mft.MFTEntryHeader)\n mft_entry = mft_entry_builder << sr.cref.structure\n\n print(\"NAME:\", mft_entry.name)\n\n try:\n with open(\"01.mft\",\"rb\") as file:\n mft_entry << file.read(1024)\n except:\n print(\"[!] file not found\")\n\n mft_entry.print()\n\n exit(0)\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "structureReader", "package_url": "https://pypi.org/project/structureReader/", "platform": "", "project_url": "https://pypi.org/project/structureReader/", "project_urls": null, "release_url": "https://pypi.org/project/structureReader/2.1.11/", "requires_dist": null, "requires_python": ">=3", "summary": "Simple static structure/union parser", "version": "2.1.11", "yanked": false, "yanked_reason": null }, "last_serial": 6234187, "releases": { "1.1.0": [ { "comment_text": "", "digests": { "md5": "de6bfe7cc50b675abc2f8bb46b4812fb", "sha256": "60ad30199c00b80f6d3f22951dee599d3c8a5200413fd9ff801abefaaf797d3b" }, "downloads": -1, "filename": "structureReader-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "de6bfe7cc50b675abc2f8bb46b4812fb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 14565, "upload_time": "2019-09-06T08:57:24", "upload_time_iso_8601": "2019-09-06T08:57:24.258985Z", "url": "https://files.pythonhosted.org/packages/b2/d4/93465dc70599ba61c93e35e8561cbe9f78f93c3569d08139232fd186374c/structureReader-1.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "1.1.7": [ { "comment_text": "", "digests": { "md5": "9d69301eac2c92191aa00beeb5da1607", "sha256": "949a39fda652a045c3ebcffbbcb5c78b1099e3ed6947d5832886ff1222ea332e" }, "downloads": -1, "filename": "structureReader-1.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "9d69301eac2c92191aa00beeb5da1607", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 17597, "upload_time": "2019-10-24T00:49:08", "upload_time_iso_8601": "2019-10-24T00:49:08.736325Z", "url": "https://files.pythonhosted.org/packages/76/4b/17c00b1ecf44d3a588591ebc18a6ffeb794510f54b50f1afbb6a1093c4fe/structureReader-1.1.7-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "b258c3224647454e8992a00b2ab4768f", "sha256": "6f535e438e132803af553d5ccfdbca7bff2272df88f979708354282583eb3d47" }, "downloads": -1, "filename": "structureReader-1.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b258c3224647454e8992a00b2ab4768f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 17736, "upload_time": "2019-11-06T00:29:41", "upload_time_iso_8601": "2019-11-06T00:29:41.977798Z", "url": "https://files.pythonhosted.org/packages/66/5f/a95db56969200d82975e48c5da549d19bd5c2ead2052307b5567f4bee492/structureReader-1.2.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "7571da6ebba887e43b084c7282b996e3", "sha256": "f634a1c0d337af6d2aad8ac822d252d2cdae3966895b43d9491aa13212d54448" }, "downloads": -1, "filename": "structureReader-1.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7571da6ebba887e43b084c7282b996e3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 17761, "upload_time": "2019-11-28T05:23:53", "upload_time_iso_8601": "2019-11-28T05:23:53.156468Z", "url": "https://files.pythonhosted.org/packages/56/f7/d1cbaecbdf0fac2ebb8197b17f0b4aa4b3a71f7db5b329228602921f5285/structureReader-1.2.2-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "05d3cd5807ba39f9d2259f98b73d828e", "sha256": "3147956f2038651bf028be249b48b350b2ac779e38357c10a9a226373cf428f5" }, "downloads": -1, "filename": "structureReader-1.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "05d3cd5807ba39f9d2259f98b73d828e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 17929, "upload_time": "2019-11-28T09:27:47", "upload_time_iso_8601": "2019-11-28T09:27:47.667013Z", "url": "https://files.pythonhosted.org/packages/47/2b/31c41ac62f41b1b1ddf713a4bbc220f2411cf482e1fa4b6bfe2598f72a92/structureReader-1.2.3-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "2.1.10": [ { "comment_text": "", "digests": { "md5": "820eb2dbbbf5b3426810f2da6b2d97ed", "sha256": "4542da54aedcb4b4416e42463c38f70ff44bd87cf08f704d531afb3166f8ee41" }, "downloads": -1, "filename": "structureReader-2.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "820eb2dbbbf5b3426810f2da6b2d97ed", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 25372, "upload_time": "2019-12-03T05:38:28", "upload_time_iso_8601": "2019-12-03T05:38:28.025568Z", "url": "https://files.pythonhosted.org/packages/1b/3c/20e7a7f03972619aeb52e9a8d44d0f7ac751120c78042c0d89e4a97de53a/structureReader-2.1.10-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "2.1.11": [ { "comment_text": "", "digests": { "md5": "96acdbee60e34d112cd445fdb04e6e3d", "sha256": "ad2d05494b6360dc387d2f4db98133a30c84d83807a5fcf93e691d374f7cdfac" }, "downloads": -1, "filename": "structureReader-2.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "96acdbee60e34d112cd445fdb04e6e3d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 25456, "upload_time": "2019-12-03T10:17:08", "upload_time_iso_8601": "2019-12-03T10:17:08.716713Z", "url": "https://files.pythonhosted.org/packages/08/21/d8f029845aed88d2f12cd7989ff601c092a97bbdca5834e234edfb2e8702/structureReader-2.1.11-py3-none-any.whl", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "96acdbee60e34d112cd445fdb04e6e3d", "sha256": "ad2d05494b6360dc387d2f4db98133a30c84d83807a5fcf93e691d374f7cdfac" }, "downloads": -1, "filename": "structureReader-2.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "96acdbee60e34d112cd445fdb04e6e3d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 25456, "upload_time": "2019-12-03T10:17:08", "upload_time_iso_8601": "2019-12-03T10:17:08.716713Z", "url": "https://files.pythonhosted.org/packages/08/21/d8f029845aed88d2f12cd7989ff601c092a97bbdca5834e234edfb2e8702/structureReader-2.1.11-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }