Advertisement
Guest User

Untitled

a guest
Dec 9th, 2012
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.37 KB | None | 0 0
  1. import sys
  2.  
  3. import psyco; psyco.full()
  4.  
  5. def remove_header(s):
  6. if s.startswith("00101101"):
  7. return s[8:]
  8.  
  9. raise Exception("DSDDDSDDS")
  10.  
  11. def check_preamble(s):
  12. row = 0
  13. col = 1
  14.  
  15. p = ""
  16. while len(p) < 56:
  17. for i in xrange(col, 8):
  18. p += s[row*8+i]
  19.  
  20. row += 1
  21. if row % 2 == 0:
  22. col += 1
  23.  
  24. if p == "01010110011011101101001001110001011110010100011000010000":
  25. #print "preamble OK"
  26. pass
  27.  
  28. def deconv(s):
  29. out = ""
  30. numbits = 0
  31. byte = 0
  32.  
  33. pos = 0
  34. prevs = [0, 0, 0, 0]
  35. g = [0, 0, 0, 0]
  36.  
  37. while pos < len(s) - 4:
  38. z0 = (0 + prevs[-2] + prevs[-4]) % 2
  39. z1 = (0 + prevs[-2] + prevs[-3] + prevs[-4]) % 2
  40. z2 = (0 + prevs[-1] + prevs[-3] + prevs[-4]) % 2
  41. z3 = (0 + prevs[-1] + prevs[-2] + prevs[-3] + prevs[-4]) % 2
  42.  
  43. o0 = (1 + prevs[-2] + prevs[-4]) % 2
  44. o1 = (1 + prevs[-2] + prevs[-3] + prevs[-4]) % 2
  45. o2 = (1 + prevs[-1] + prevs[-3] + prevs[-4]) % 2
  46. o3 = (1 + prevs[-1] + prevs[-2] + prevs[-3] + prevs[-4]) % 2
  47.  
  48. zs = "%d%d%d%d" % (z0, z1, z2, z3)
  49. os = "%d%d%d%d" % (o0, o1, o2, o3)
  50.  
  51. if s[pos:pos+4] == zs:
  52. #print "Found bit 0"
  53. prevs.append(0)
  54. g = [z0, z1, z2, z3]
  55. elif s[pos:pos+4] == os:
  56. #print "Found bit 1"
  57. prevs.append(1)
  58. g = [o0, o1, o2, o3]
  59. else:
  60. print "failed to deconv"
  61. print "actual", s[pos:pos+4]
  62. print "expected 0", zs
  63. print "expected 1", os
  64. return pos
  65.  
  66. byte |= (prevs[-1] << numbits)
  67. numbits += 1
  68.  
  69. if numbits == 8:
  70. out += chr(byte)
  71. byte = 0
  72. numbits = 0
  73. print repr(out)
  74. pos += 4
  75.  
  76. return pos
  77.  
  78. def deinterleave(s):
  79. start = 0
  80. pos = 0
  81. col = 0
  82. out = ""
  83. while pos < len(s):
  84. c = s[pos]
  85. if c == "X":
  86. #print "X at ", len(out)
  87. out += c
  88. elif c == "Z":
  89. out += c
  90. else:
  91. if col in (0, 2, 3, 6, 7):
  92. if c == "0":
  93. out += "1"
  94. else:
  95. out += "0"
  96. else:
  97. if c == "0":
  98. out += "0"
  99. else:
  100. out += "1"
  101.  
  102. pos += 17
  103. col += 1
  104. if col == 8:
  105. start += 8
  106. pos = start
  107. col = 0
  108.  
  109. # print out
  110. # print len(out)
  111.  
  112. return out
  113.  
  114. def main():
  115. best = 0
  116. data = "310231103210010213123213202021122323003013330012031312330323"
  117. data += "X" * 16
  118. data += "133210200332321211220313013012011210122323103203000203322301300301100220231030020102022223133003010302220313100321030222211302030103322233332103232322222333233323122310230023012300230023"
  119.  
  120. # data = "310231103210010213123213202001122323303013330212131333332203"
  121. # data += "X" * 16
  122. # data += "0002013100203211110000013323100002031130203332300121032323003011011202222311300301020222231330030103022203131003210302222113020301033222333321032323222223332333231223102300230123032303"
  123.  
  124. # for i in xrange(100, len(data)):
  125. # for c in "0123":
  126. # res = loop(data[:i] + c + data[i+1:])
  127. # if res > best:
  128. # print data[:i] + c + data[i+1:]
  129. # print i, c, res
  130. # best = res
  131.  
  132. loop(data)
  133. def loop(data):
  134.  
  135.  
  136. s = ""
  137. for c in data:
  138. if c == "0":
  139. s += "11"
  140. elif c == "1":
  141. s += "10"
  142. elif c == "2":
  143. s += "01"
  144. elif c == "3":
  145. s += "00"
  146. elif c == "X":
  147. s += "XX"
  148. elif c == "Z":
  149. s += "ZZ"
  150.  
  151.  
  152. s = remove_header(s)
  153.  
  154. check_preamble(s)
  155.  
  156. s = deinterleave(s)
  157.  
  158. if s[352:384] == "01010110011011101101001001110001":
  159. #print "resync OK"
  160. s = s[:352] + s[384:]
  161. else:
  162. print "resync failed!"
  163. return 0
  164.  
  165. ss = ""
  166. for c in s:
  167. if c in "Z01":
  168. ss += c
  169.  
  170. s = ss
  171.  
  172. #print s
  173.  
  174. return deconv(s)
  175.  
  176. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement