OTAEquipment.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. from zlib import crc32
  2. from Ansjer.settings import *
  3. from django.core import serializers
  4. from wsgiref.util import FileWrapper
  5. import traceback, hashlib
  6. from Ansjer.settings import SERVER_DOMAIN
  7. from django.views.decorators.csrf import csrf_exempt
  8. from django.views.generic import TemplateView
  9. from django.utils.decorators import method_decorator
  10. from Model.models import Equipment_Version
  11. from Model.models import Device_User
  12. from Service.TokenManager import JSONTokenManager
  13. from Service.ModelService import ModelService
  14. from Service.CommonService import CommonService
  15. from Service.ResponseService import *
  16. def getEquipmentVersion(code):
  17. if code == '31162001A':
  18. return ResponseFormal(0,{'softwareVersion': '1.4.3'})
  19. try:
  20. equipmentValid = Equipment_Version.objects.filter(code = code,status=1).order_by('-data_joined')
  21. except Exception as e:
  22. errorInfo = traceback.format_exc()
  23. print('查询数据库错误: %s' % errorInfo)
  24. return ResponseFormal(500,{'details':repr(e)})
  25. else:
  26. if equipmentValid:
  27. equipment = equipmentValid[0]
  28. return ResponseFormal(0, {'softwareVersion': equipment.softwareVersion})
  29. else:
  30. return ResponseFormal(900)
  31. def getUrl(filePath):
  32. urls = []
  33. filePaths = filePath.split(',')
  34. if len(filePaths) > 0:
  35. for path in filePaths:
  36. if path.find('static/Upgrade/') != -1:
  37. path = path.replace('static/Upgrade/', '').replace('\\', '/')
  38. url = SERVER_DOMAIN + '/OTA/downloads/' + path
  39. urls.append(url)
  40. else:
  41. url = SERVER_DOMAIN + 'OTA/downloads/' + filePath.replace('\\', '/')
  42. urls.append(url)
  43. return urls
  44. else:
  45. return ''
  46. def getUpdataFileUrl(code):
  47. try:
  48. equipmentValid = Equipment_Version.objects.filter(code=code,status=1).order_by('-data_joined')
  49. except Exception as e:
  50. errorInfo = traceback.format_exc()
  51. print('查询数据库错误: %s' % errorInfo)
  52. return ResponseFormal(500,{'details':repr(e)})
  53. else:
  54. if equipmentValid:
  55. equipment = equipmentValid[0]
  56. url = getUrl(equipment.filePath)
  57. if len(url) > 0:
  58. return ResponseFormal(0,{
  59. "urlCount": len(url),
  60. "url": url,
  61. "fileSize": equipment.fileSize,
  62. "Description": equipment.Description,
  63. })
  64. else:
  65. return ResponseFormal(901)
  66. else:
  67. return ResponseFormal(902)
  68. #from django.core.files.uploadedfile import TemporaryUploadedFile
  69. def getDir(fileType, fileName, fileCode, fileVersion):
  70. try:
  71. if fileCode != None and fileVersion != None:
  72. path = '/'.join((BASE_DIR, 'static/Upgrade', fileType, fileCode, fileVersion)).replace('\\', '/') + '/'
  73. else:
  74. if fileType != 'IPC' and fileType != 'DVR' and fileType != 'NVR' and fileType != 'XVR':
  75. path = '/'.join((BASE_DIR, "static/Upgrade", 'Other')).replace('\\', '/') + '/'
  76. if not os.path.exists(path):
  77. os.makedirs(path)
  78. file_name = path + str(fileName)
  79. if os.path.exists(file_name):
  80. os.remove(file_name)
  81. destination = open(file_name, 'wb+')
  82. for chunk in fileName.chunks():
  83. destination.write(chunk)
  84. destination.close()
  85. else:
  86. file_name = path + str(fileName)
  87. if os.path.exists(file_name):
  88. os.remove(file_name)
  89. destination = open(file_name, 'wb+')
  90. for chunk in fileName.chunks():
  91. destination.write(chunk)
  92. destination.close()
  93. except Exception as e:
  94. errorInfo = traceback.format_exc()
  95. print('上传文件错误: %s' % errorInfo)
  96. return ResponseFormal(700,{'details':repr(e)})
  97. else:
  98. index = file_name.find('static/')
  99. filePath = file_name[index:]
  100. return ResponseFormal(0,{'filePath':filePath})
  101. def addNewEquipmentVersion(deviceContent,token):
  102. """
  103. :param deviceContent:
  104. :return:
  105. """
  106. if token is None:
  107. return ResponseJSON(311)
  108. tokenManager = JSONTokenManager()
  109. error_code = tokenManager.verify_AToken(token)
  110. if error_code == 0:
  111. pass
  112. else:
  113. return tokenManager.errorCodeInfo(error_code)
  114. userID = tokenManager.accessDict.get('userID', None)
  115. own_permission = ModelService.check_permission(userID=userID, permID=220)
  116. if own_permission is not True:
  117. # pass
  118. return ResponseFormal(404)
  119. try:
  120. # print(deviceContent)
  121. deviceData = json.loads(deviceContent)
  122. print('----------')
  123. print(deviceData)
  124. except Exception as e:
  125. return ResponseFormal(803)
  126. else:
  127. version = deviceData.get('version', None)
  128. if version != None:
  129. eVersionValid = Equipment_Version.objects.filter(version = version)
  130. # if eVersionValid:
  131. # return ResponseFormal(904)
  132. else:
  133. return ResponseFormal(806)
  134. try:
  135. filePath = deviceData.get('filePath', None)
  136. if filePath == None:
  137. return ResponseFormal(806)
  138. deviceData['filePath'] = ','.join(filePath)
  139. equipmentVersion = Equipment_Version(eid = CommonService.getUserID(getUser=False, setOTAID=True), **deviceData)
  140. equipmentVersion.save()
  141. except Exception as e:
  142. errorInfo = traceback.format_exc()
  143. print('添加设备错误: %s ' % errorInfo)
  144. return ResponseFormal(806,{'details':repr(e)})
  145. else:
  146. sqlJSON = serializers.serialize('json', [equipmentVersion])
  147. sqlList = json.loads(sqlJSON)
  148. sqlDict =dict(zip(["datas"], [sqlList]))
  149. return ResponseFormal(0,sqlDict)
  150. def downloadUrl(fileType, fileCode, fileVersion, fileName):
  151. fullPath = os.path.join(BASE_DIR, "static/Upgrade").replace('\\', '/')
  152. if fileType == 'IPC':
  153. Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/')
  154. elif fileType == 'DVR':
  155. Path = '/'.join((fullPath, 'DVR', fileCode, fileVersion, fileName)).replace('\\', '/')
  156. elif fileType == 'NVR':
  157. Path = '/'.join((fullPath, 'NVR', fileCode, fileVersion, fileName)).replace('\\', '/')
  158. elif fileType == 'XVR':
  159. Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/')
  160. else:
  161. if fileType == 'CHM':
  162. Path = fileName
  163. else:
  164. Path = '/'.join((fullPath, 'Other', fileName)).replace('\\', '/')
  165. if os.path.isfile(Path):
  166. try:
  167. JSON = json.dumps(
  168. {
  169. "result_code": 0,
  170. "reason": 'Success',
  171. "result": {},
  172. "error_code": 0,
  173. }, ensure_ascii=False
  174. )
  175. wrapper = FileWrapper(open(Path, 'rb'))
  176. response = HttpResponse(wrapper, content_type="application/octet-stream")
  177. response['Content-Length'] = os.path.getsize(Path)
  178. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(Path)
  179. response['Content-MD5'] = getMD5orSHA265(Path)
  180. response['Content-SHA265'] = getMD5orSHA265(Path, 'SHA265')
  181. response['Content-CRC32'] = getMD5orSHA265(Path, 'CRC32')
  182. response['Content-Error'] = JSON
  183. return response
  184. except Exception as e:
  185. errorJSON = ResponseFormal(906,{'details':repr(e)})
  186. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  187. response['Content-Error'] = errorJSON
  188. return response
  189. else:
  190. errorJSON = ResponseFormal(907)
  191. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  192. response['Content-Error'] = errorJSON
  193. return response
  194. @csrf_exempt
  195. def downloadUpdataFileUrl(request, *callback_args, **callback_kwargs):
  196. if request.method == 'GET':
  197. request_dict = request.GET
  198. elif request.method == 'POST':
  199. request_dict = request.POST
  200. else:
  201. errorJSON = ResponseFormal(801)
  202. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  203. response['Content-Error'] = errorJSON
  204. return response
  205. fileType = request_dict.get('fileType', None)
  206. fileCode = request_dict.get('fileCode', None)
  207. fileVersion = request_dict.get('fileVersion', None)
  208. fileName = request_dict.get('fileName', None)
  209. if fileType != None and fileCode != None and fileVersion != \
  210. None and fileName != None:
  211. response = downloadUrl(fileType, fileCode, fileVersion, fileName)
  212. return response
  213. else:
  214. errorJSON = ResponseFormal(800)
  215. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  216. response['Content-Error'] = errorJSON
  217. return response
  218. '''
  219. http://192.168.136.40:8077/OTA/getEquipmentVersion?31AX162001A
  220. '''
  221. @csrf_exempt
  222. def getEquipmentVersionInterface(request,
  223. *callback_args, **callback_kwargs):
  224. if request.method == "POST":
  225. request.encoding ='utf-8'
  226. code = request.POST.get('code', None)
  227. if code is not None:
  228. response = HttpResponse(getEquipmentVersion(code))
  229. return response
  230. else:
  231. return ResponseJSON(800)
  232. elif request.method == "GET":
  233. request.encoding = 'gb2312'
  234. code = request.GET.get('code', None)
  235. if code is not None:
  236. response = HttpResponse(getEquipmentVersion(code))
  237. return response
  238. else:
  239. return ResponseJSON(800)
  240. else:
  241. return ResponseJSON(801)
  242. @csrf_exempt
  243. def getUpdataFileUrlInterface(request,
  244. *callback_args, **callback_kwargs):
  245. if request.method == "POST":
  246. request.encoding = 'utf-8'
  247. code = request.POST.get('code', None)
  248. if code is not None:
  249. response = HttpResponse(getUpdataFileUrl(code))
  250. return response
  251. else:
  252. return ResponseJSON(800)
  253. elif request.method == "GET":
  254. request.encoding = 'utf-8'
  255. code = request.GET.get('code', None)
  256. if code is not None:
  257. response = HttpResponse(getUpdataFileUrl(code))
  258. return response
  259. else:
  260. return ResponseJSON(800)
  261. else:
  262. return ResponseJSON(801)
  263. @csrf_exempt
  264. def downloadUpdataFileUrlInterface(request, fileType, fileName,
  265. *callback_args, **callback_kwargs):
  266. if fileType is not None and fileName is not None:
  267. fullPath = os.path.join(BASE_DIR, "static/Upgrade/").replace('\\', '/')
  268. if fileType == 'IPC':
  269. fullPath += 'IPC/' + fileName
  270. elif fileType == 'DVR':
  271. fullPath += 'DVR/' + fileName
  272. elif fileType == 'NVR':
  273. fullPath += 'NVR/' + fileName
  274. elif fileType == 'XVR':
  275. fullPath += 'XVR/' + fileName
  276. elif fileType == 'User':
  277. fullPath = os.path.join(BASE_DIR, "static/").replace('\\', '/')
  278. fullPath += 'User/' + fileName
  279. elif fileType == 'ADCloud':
  280. fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/')
  281. fullPath += 'ADCloud/' + fileName
  282. elif fileType == 'ACCloud':
  283. fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/')
  284. fullPath += 'ACCloud/' + fileName
  285. else:
  286. fullPath += 'Other/' + fileName
  287. print(fullPath)
  288. if os.path.isfile(fullPath):
  289. try:
  290. JSON = ResponseFormal(0)
  291. if fileType != 'User':
  292. wrapper = FileWrapper(open(fullPath, 'rb'))
  293. response = HttpResponse(wrapper, content_type="application/octet-stream")
  294. response['Content-Length'] = os.path.getsize(fullPath)
  295. response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(fullPath)
  296. response['Content-MD5'] = getMD5orSHA265(fullPath)
  297. #校验文件md5值
  298. # if response['Content-MD5'] ==
  299. # print(response['Content-MD5'])
  300. response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265')
  301. response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32')
  302. response['Content-Error'] = JSON
  303. return response
  304. else:
  305. Imagedata = open(fullPath, 'rb').read()
  306. response = HttpResponse(Imagedata, content_type="image/jpeg")
  307. return response
  308. except Exception as e:
  309. errorJSON = ResponseFormal(906)
  310. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  311. response['Content-Error'] = errorJSON
  312. return response
  313. else:
  314. errorJSON = ResponseFormal(907)
  315. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  316. response['Content-Error'] = errorJSON
  317. return response
  318. else:
  319. errorJSON = ResponseFormal(800)
  320. response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
  321. response['Content-Error'] = errorJSON
  322. return response
  323. class getUploadFiletoDirView(TemplateView):
  324. @method_decorator(csrf_exempt)
  325. def dispatch(self, *args, **kwargs):
  326. return super(getUploadFiletoDirView, self).dispatch(*args, **kwargs)
  327. def post(self, request, *args, **kwargs):
  328. request.encoding = 'utf-8'
  329. token = request.POST.get('token', None)
  330. fileType = request.POST.get('fileType', None)
  331. fileCode = request.POST.get('fileCode', None)
  332. fileVersion = request.POST.get('fileVersion', None)
  333. fileName = request.FILES.get('fileName', None)
  334. return self.ValidationError(token, fileType, fileName,
  335. filefileCode=fileCode, fileVersion=fileVersion)
  336. def get(self, request, *args, **kwargs):
  337. request.encoding = 'gb2312'
  338. token = request.GET.get('token', None)
  339. fileType = request.GET.get('fileType', None)
  340. fileCode = request.GET.get('fileCode', None)
  341. fileVersion = request.GET.get('fileVersion', None)
  342. fileName = request.FILES.get('fileName', None)
  343. return self.ValidationError(token, fileType, fileName,filefileCode=fileCode, fileVersion=fileVersion)
  344. def ValidationError(self, token, fileType, fileName, *args, **kwargs):
  345. if fileName != None and fileType != None and token != None:
  346. tM = JSONTokenManager()
  347. error_code = tM.verify_AToken(token)
  348. if error_code == 0:
  349. userID = tM.accessDict.get('userID', None)
  350. if userID:
  351. own_permission = ModelService.check_permission(userID=userID, permID=210)
  352. if own_permission is True:
  353. fileCode = kwargs.get('fileCode', None)
  354. fileVersion = kwargs.get('fileVersion', None)
  355. if fileVersion != None and fileCode != None:
  356. response = HttpResponse(self.getUploadFiletoDir(userID, fileType, fileName,
  357. fileCode, fileVersion=fileVersion))
  358. return response
  359. else:
  360. response = HttpResponse(self.getUploadFiletoDir(userID, fileType, fileName))
  361. return response
  362. else:
  363. return ResponseJSON(404)
  364. else:
  365. return ResponseJSON(310)
  366. else:
  367. response = HttpResponse(tM.errorCodeInfo(error_code))
  368. return response
  369. else:
  370. return ResponseJSON(800)
  371. def getUploadFiletoDir(self, userID, fileType, fileName, *args, **kwargs):
  372. """
  373. 将上传的文件写入服务器对应目录下
  374. :param Type: equipment type
  375. :param fileName: File name of upgrade file.
  376. :return: filePath
  377. """
  378. try:
  379. User = Device_User.objects.filter(userID = userID)
  380. except Exception as e:
  381. errorInfo = traceback.format_exc()
  382. print('查询数据库错误: %s' % errorInfo)
  383. return ResponseFormal(500,{'details':repr(e)})
  384. else:
  385. if not User:
  386. return ResponseFormal(113)
  387. own_perm = ModelService.check_permission(userID,permID=210)
  388. if own_perm is not True:
  389. return ResponseFormal(605)
  390. updataFile = fileName.name
  391. updataFile = updataFile.replace(' ', '+')
  392. versionIndex = updataFile.find('.', updataFile.find('.', updataFile.find('.') + 1) + 1)
  393. codeIndex = versionIndex + 12
  394. if codeIndex != -1 and versionIndex != -1:
  395. fileVersion = len(updataFile[1: versionIndex]) > 0 and updataFile[1: versionIndex] or None
  396. fileCode = len(updataFile[versionIndex + 1: codeIndex]) > 0 and \
  397. updataFile[versionIndex + 1: codeIndex] or None
  398. if fileCode is not None and fileVersion is not None:
  399. return getDir(fileType, fileName, fileCode, fileVersion)
  400. else:
  401. fileCode = kwargs.get('fileCode', None)
  402. fileVersion = kwargs.get('fileVersion', None)
  403. print(fileCode, fileVersion)
  404. if fileCode != None and fileVersion != None:
  405. return getDir(fileType, fileName, fileCode, fileVersion)
  406. else:
  407. return ResponseFormal(903)
  408. else:
  409. fileCode = kwargs.get('fileCode', None)
  410. fileVersion = kwargs.get('fileVersion', None)
  411. if fileCode != None and fileVersion != None:
  412. return getDir(fileType, fileName, fileCode, fileVersion)
  413. else:
  414. return ResponseFormal(903)
  415. @csrf_exempt
  416. def addNewEquipmentVersionInterface(request, *callback_args,
  417. **callback_kwargs):
  418. if request.method == "POST":
  419. request.encoding = 'utf-8'
  420. deviceContent = request.POST.get('content', None).encode('utf-8')
  421. token = request.POST.get('token', None)
  422. deviceContent = str(deviceContent, encoding='utf-8')
  423. deviceContent = deviceContent.replace(' ', ' ').replace('\'', '\"')
  424. print(deviceContent, type(deviceContent))
  425. if deviceContent is not None:
  426. response = HttpResponse(addNewEquipmentVersion(deviceContent,token))
  427. return response
  428. else:
  429. return ResponseJSON(800)
  430. elif request.method == "GET":
  431. request.encoding = 'gb2312'
  432. deviceContent = request.GET.get('content', None).encode('gb2312')
  433. deviceContent = str(deviceContent, encoding='gb2312')
  434. token = request.GET.get('token', None)
  435. deviceContent = deviceContent.replace(' ', ' ').replace('\'', '\"')
  436. if deviceContent is not None:
  437. response = HttpResponse(addNewEquipmentVersion(deviceContent,token))
  438. return response
  439. else:
  440. return ResponseJSON(800)
  441. else:
  442. return ResponseJSON(801)
  443. @csrf_exempt
  444. def showAllEquipmentVersion(userID):
  445. try:
  446. userValid = Device_User.objects.filter(userID = userID).order_by('-data_joined')
  447. except Exception as e:
  448. errorInfo = traceback.format_exc()
  449. print('查询数据库错误: %s' % errorInfo)
  450. return ResponseFormal(500)
  451. else:
  452. if userValid:
  453. own_permission = ModelService.check_permission(userID=userID, permID=240)
  454. if own_permission:
  455. sqlJSON = serializers.serialize('json', Equipment_Version.objects.all()) # .order_by('-data_joined'))
  456. sqlList = json.loads(sqlJSON)
  457. print(sqlList, sqlJSON)
  458. sqlDict = dict(zip(["datas"], [sqlList]))
  459. return ResponseFormal(0,sqlDict)
  460. else:
  461. return ResponseFormal(604)
  462. else:
  463. return ResponseFormal(113)
  464. @csrf_exempt
  465. def showAllEquipmentVersionInterface(request, *callback_args,
  466. **callback_kwargs):
  467. if request.method == 'POST':
  468. token = request.POST.get('token', None)
  469. if token != None:
  470. tM = JSONTokenManager()
  471. error_code = tM.verify_AToken(token)
  472. if error_code == 0:
  473. userID = tM.accessDict.get('userID', None)
  474. if userID:
  475. response = HttpResponse(showAllEquipmentVersion(userID))
  476. return response
  477. else:
  478. return ResponseJSON(310)
  479. else:
  480. response = HttpResponse(tM.errorCodeInfo(error_code))
  481. return response
  482. else:
  483. return ResponseJSON(800)
  484. elif request.method == 'GET':
  485. token = request.GET.get('token', None)
  486. if token != None:
  487. tM = JSONTokenManager()
  488. error_code = tM.verify_AToken(token)
  489. if error_code == 0:
  490. userID = tM.accessDict.get('userID', None)
  491. if userID:
  492. response = HttpResponse(showAllEquipmentVersion(userID))
  493. return response
  494. else:
  495. return ResponseJSON(310)
  496. else:
  497. response = HttpResponse(tM.errorCodeInfo(error_code))
  498. return response
  499. else:
  500. return ResponseJSON(800)
  501. import zlib
  502. @csrf_exempt
  503. def getCRC32(filePath):
  504. print(filePath)
  505. block_size = 1024 * 1024
  506. crc = 0
  507. try:
  508. fd = open(filePath, 'rb')
  509. while True:
  510. buffer = fd.read(block_size)
  511. if len(buffer) == 0: # EOF or file empty. return hashes
  512. fd.close()
  513. return crc # 返回的是十进制的值
  514. crc = zlib.crc32(buffer, crc)
  515. except Exception as e:
  516. return ResponseFormal(908,{'details':repr(e)})
  517. def getMD5orSHA265(fileName, encryptionType='MD5'):
  518. """
  519. :param filePath:
  520. :param encryptionType:
  521. :return:
  522. """
  523. if not os.path.isfile(fileName):
  524. return ''
  525. else:
  526. if encryptionType == 'MD5':
  527. encryption = hashlib.md5()
  528. elif encryptionType == 'SHA265':
  529. encryption = hashlib.sha256()
  530. elif encryptionType == 'CRC32':
  531. f = open(fileName, 'rb')
  532. chunk = f.read()
  533. return crc32(chunk)
  534. f = open(fileName, 'rb')
  535. block_size = 8192 # why is 8192 | 8192 is fast than 2048
  536. while True:
  537. chunk = f.read(block_size)
  538. if not chunk:
  539. break
  540. encryption.update(chunk)
  541. f.close()
  542. return encryption.hexdigest()
  543. def CRC(fileName):
  544. fd = open(fileName, 'rb')
  545. dwSize = os.path.getsize(fileName)
  546. lpBuffer = fd.read()
  547. crc = -1
  548. CRC32Table = [0] * 256
  549. ulPolynomial = 0x04C11DB7
  550. len = dwSize
  551. buffer = lpBuffer
  552. for index in range(0xFF):
  553. value = 0
  554. ref = index
  555. for n in range(9):
  556. if ref & 1:
  557. value |= 1 << (8 - n)
  558. ref >>= 1
  559. CRC32Table[index] = value << 24
  560. for j in range(8):
  561. CRC32 = CRC32Table[index] & (1 << 31) and ulPolynomial or 0
  562. CRC32Table[index] = (CRC32Table[index] << 1) ^ CRC32
  563. value = 0
  564. ref = CRC32Table[index]
  565. for n in range(33):
  566. if ref & 1:
  567. value |= 1 << (32 - n)
  568. ref >>= 1
  569. CRC32Table[index] = value
  570. index = 0
  571. while len:
  572. len -= 1
  573. crc = (crc >> 8) ^ CRC32Table[(crc & 0xFF) ^ buffer[index]]
  574. index += 1
  575. print(crc ^ 0xffffffff)
  576. return crc ^ 0xffffffff