docs: def btreeSearch(self, ip):
          """
          " b-tree search method
          " param: ip
          """
          if not ip.isdigit(): ip = self.ip2Long(ip)
  
          if len(self.__headerSip) < 1:
              #pass the super block
              self.__f.seek(8)
              #read the header block
              b = self.__f.read(8192)
              #parse the header block
              sip = None
              ptr = None
              for i in range(0, len(b)-1, 8):
                  sip = self.getLong(b, i)
                  ptr = self.getLong(b, i+4)
                  if ptr == 0:
                      break
                  self.__headerSip.append(sip)
                  self.__headerPtr.append(ptr)
  
          headerLen = len(self.__headerSip) - 1
          l, h, sptr, eptr = (0, headerLen, 0, 0)
          while l <= h:
              m = int((l+h)/2)
  
              if ip == self.__headerSip[m]:
                  if m > 0:
                      sptr = self.__headerPtr[m-1]
                      eptr = self.__headerPtr[m]
                      break;
                  else:
                      sptr = self.__headerPtr[m]
                      eptr = self.__headerPtr[m+1]
                      break;
  
              if ip > self.__headerSip[m]:
                  if m == headerLen:
                      sptr = self.__headerPtr[m-1]
                      eptr = self.__headerPtr[m]
                      break;
                  elif ip < self.__headerSip[m+1]:
                      sptr = self.__headerPtr[m]
                      eptr = self.__headerPtr[m+1]
                      break;
  
                  l = m + 1
              else:
                  if m == 0:
                      sptr = self.__headerPtr[m]
                      eptr = self.__headerPtr[m+1]
                      break;
                  elif ip > self.__headerSip[m-1]:
                      sptr = self.__headerPtr[m-1]
                      eptr = self.__headerPtr[m]
                      break;
  
                  h = m - 1
  
          if sptr == 0: return "N1"
  
          indexLen = eptr - sptr
          self.__f.seek(sptr)
          b = self.__f.read(indexLen + 12)
  
          l, h, mixPtr = (0, int(indexLen/12), 0)
          while l <= h:
              m = int((l+h)/2)
              offset = m * 12
  
              if ip >= self.getLong(b, offset):
                  if ip > self.getLong(b, offset+4):
                      l = m + 1
                  else:
                      mixPtr = self.getLong(b, offset+8)
                      break;
              else:
                  h = m - 1
  
          if mixPtr == 0: return "N2"
  
          return self.returnData(mixPtr)