daily pastebin goal
68%
SHARE
TWEET

Untitled

a guest Dec 9th, 2012 73 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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()
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top