utils.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import random
  4. import string
  5. import struct
  6. import time
  7. def get_random_str(num, seq=string.ascii_letters):
  8. ret_list = []
  9. for i in range(1, num + 1):
  10. ret_list.append("".join(random.sample(seq, 1)))
  11. return "".join(ret_list)
  12. def make_six_bytes_session_id():
  13. # 至少可以用到2050
  14. ts = long(time.time() * 100000)
  15. ts = ts + long(get_random_str(2, seq = string.digits))
  16. return fill_2_hexByte(hex(ts), 12)
  17. def hexbyte_2_bin(hexCode):
  18. binTemp = bin(int(hexCode, 16))
  19. needNum = 8 - len(binTemp) + 2
  20. c = '00000000'
  21. result = c[0:needNum] + binTemp[2::]
  22. return result
  23. def decimal_2_hexByte(decimalCode):
  24. hexTemp = hex(decimalCode)
  25. c = '00'
  26. needNum = 2 - len(hexTemp) + 2
  27. result = c[0:needNum] + hexTemp[2::]
  28. return result
  29. def fill_2_hexByte(hexCode, num = 4, reverse = False):
  30. hexCode = hexCode.replace('L', '')
  31. tList = ['0' for _ in range(num)]
  32. c = ''.join(tList)
  33. needNum = len(c) + 2 - len(hexCode)
  34. if needNum <= 0:
  35. return hexCode[2::].upper()
  36. result = c[0:needNum] + hexCode[2::]
  37. if reverse:
  38. return reverse_hex(result).upper()
  39. return result.upper()
  40. def pack_float(value, reverse = False):
  41. """
  42. 将浮点数转换为16进制转换的 float
  43. :param value: 浮点数
  44. :param reverse: 小端 (True)或者 大端
  45. :return:
  46. """
  47. sign = ">f" if not reverse else "<f"
  48. return struct.pack(sign, value).encode("hex")
  49. def asc_to_string(ascString):
  50. result = ''
  51. for ii in range(len(ascString) / 2):
  52. char = int(ascString[ii * 2:ii * 2 + 2], 16)
  53. if char == 0:
  54. break
  55. result += chr(char)
  56. return result
  57. def unpack_float(value, reverse = False):
  58. """
  59. 解析16进制浮点数
  60. :param value: 16进制浮点数
  61. :param reverse:小端 (True)或者 大端
  62. :return:
  63. """
  64. sign = ">f" if not reverse else "<f"
  65. return struct.unpack(sign, value.decode("hex"))[0]
  66. def reverse_hex(hexNum):
  67. newHexNum = ""
  68. while hexNum:
  69. newHexNum += hexNum[-2:]
  70. hexNum = hexNum[: -2]
  71. return newHexNum
  72. def calc_crc(data):
  73. checkSum = 0
  74. for ii in range(len(data) / 2):
  75. hexByte = int(data[2 * ii:2 * ii + 2], 16)
  76. checkSum = checkSum ^ hexByte
  77. checkSum = fill_2_hexByte(hex(checkSum), 1)
  78. return str(checkSum)