2020年9月

坑太多.exe

用例

  • 1010+8-6-2+10-7+1+8+(1+6+(99)*8+1) 768
  • 3+2{1+2[-4/(8-6)+7]} 25

思路

  1. 把输入的字符串处理为数字和运算符组成的列表
  2. 循环遍历列表 找到左括号时 进行递归 直到没有不再遇到左括号
  3. 按乘除优先级高于加减 进行运算 并将结果覆盖参与运算的后者
  4. 删除 参与运算的前者和运算符 返回前删除左右括号
  5. 子一级,也就是括号内的结果运算完成 则把当前这一级进行同样的运算
  6. 再次返回给上一级 或者发现列表被删除只剩一个 也就是最终运算结果 跳出
  7. 得到最终计算结果
def convert(texts: str) -> list:
    tmp = ""
    _text = []
    texts = texts.replace(" ", "").replace("{", "(").replace("}", ")").replace("[", "(").replace("]", ")")
    for index, char in enumerate(texts):
        if char == "(":
            pass
        elif char == ")":
            if tmp != "":
                _text.append(int(tmp))
                tmp = ""
        elif char in ["+", "-", "*", "/"]:
            if texts[index - 1] == "(":
                _text.append(0)
            if tmp != "":
                _text.append(int(tmp))
                tmp = ""
        else:
            tmp += char
            continue
        _text.append(char)
    if tmp != "":
        _text.append(int(tmp)) 
    return _text

def calc(text: list, offset: int):
    while True:
        if text[offset] == "(":
            text = calc(text, offset+1)
        prepop = []
        _offset = offset
        while _offset >= offset and _offset < len(text) - 1: # 处理乘除
            if _offset in prepop: continue # 已经参与过运算 跳过
            if text[_offset + 1] == "(": # 当前位置的下一位是左括号 那么进行递归
                text = calc(text, _offset + 1 + 1) # 递归的起始offset是左括号后一位
            # 当前符号是乘或除 那么将符合前后进行运算 将结果放到后者
            if text[_offset] == "*":
                text[_offset + 1] = text[_offset - 1] * text[_offset + 1]
            elif text[_offset] == "/":
                text[_offset + 1] = text[_offset - 1] / text[_offset + 1]
            else:
                _offset += 1 # 不是乘或除一律跳过
                if text[_offset] == ")": # 括号结束 要跳出
                    break
                continue
            prepop.append(_offset - 1) # 已经参与了运算的元素
            prepop.append(_offset)
            _offset += 1
        text = [_ for index, _ in enumerate(text) if index not in prepop] # 去掉参与了运算的元素
        prepop = []
        _offset = offset # 遍历起始位置_offset重置为offset 
        while _offset >= offset and _offset < len(text) - 1: # 处理加减
            if _offset in prepop: continue
            if text[_offset] == "+":
                text[_offset + 1] = text[_offset - 1] + text[_offset + 1]
            elif text[_offset] == "-":
                text[_offset + 1] = text[_offset - 1] - text[_offset + 1]
            else:
                _offset += 1
                if text[_offset] == ")": # 右括号 说明运算结束
                    offset = _offset - len(prepop) # offset位置就是右括号
                    break
                continue
            prepop.append(_offset - 1)
            prepop.append(_offset)
            _offset += 1
        text = [_ for index, _ in enumerate(text) if index not in prepop]
        if len(text) == 1:
            return text[0] # 最终结果 直接返回结果
        else:
            # 还没运算完  返回上一级
            _ = text.pop(offset) # offset 是右括号位置 删除右括号
            _ = text.pop(offset - 1 - 1) # 删除左括号
            return text
        
while True:
    try:
        texts = input()
    except:
        break
    if texts == "":
        break
    texts = convert(texts)
    res = calc(texts, 0)
    print(res)

想象成左右两拨人,一边男一边女,然后进行匹配。

  • 男生和女生之间互相中意的,可以进行匹配
  • 男生中意的女生、女生中意的男生都可以不止一个
  • 要得到最多的匹配对数
def test():
    def find(index: int):
        for j in range(girls):
            # 对于左侧的第i个男生 
            # 和右侧第j个女生可以匹配 
            # 并且此时第j个女生暂时没有匹配
            if relationships[index][j] is True and status[j] is False:
                # 将第j个女生标记为马上进行匹配
                status[j] = True
                # 如果第j个女生没有匹配结果 或者 之前匹配的那个男生可以找到新的女生进行匹配
                if res.get(j) is None or find(res[j]):
                    # 那就把当前第i个男生和第j个女生正式匹配
                    res[j] = index
                    # 返回匹配成功
                    return True
        # 返回匹配失败
        return False
    boys = 4
    girls = 4
    relationships = {
        0: [False, True, False, True],
        1: [False, True, False, False],
        2: [True, False, True, False],
        3: [False, False, False, True],
    }
    total = 0
    res = {} # 匹配结果
    for index in range(boys):
        status = [False] * girls
        if find(index):
            total += 1
    print(total, res)

一点相关资料

Widevine_CAS_Overview.pdf
Widevine_DRM_Accessing_the_CDM_Repository.pdf
Widevine_DRM_Android_Vendor_Extensions.pdf
Widevine_DRM_Device_Provisioning_Models.pdf
Widevine_DRM_Encoding_and_Packaging.pdf
Widevine_DRM_Encryption_API.pdf
Widevine_DRM_Getting_Started.pdf
Widevine_DRM_Getting_Started_Devices.pdf
Widevine_DRM_Partner_License_SDK.pdf
Widevine_DRM_Proxy_Integration.pdf
Widevine_DRM_Working_With_Foreign_Keys.pdf

下载:https://www.lanzoux.com/iwEDmgxrxaj 密码:731r

说在前面

分析APP的时候发现的...

具体信息

先打开APP播放一个视频,然后打开这个地址:
CIBN超级影视端口 6990
乐视视频端口 6991

http://127.0.0.1:6991/cde
http://127.0.0.1:6990/cde

如果PC和手机在同一个局域网,PC通过局域网访问也是可以的,ip换成手机的ip。
如果是装盒子上的,通过盒子ip访问也是OK的,然后这样可以直接复制m3u8链接了,笑:)

如图:

2020-09-17T16:11:09.png

路由

一些路由:

  • /show-player
  • /control/params
  • /log/pipe
  • /log/text
  • ...

原标题:JavaScript中ArrayBuffer/DataView在python中的实现

有点标题党了。

注意这是一篇不通顺的文章

其实是想说ArrayBuffer有关的转换过程在python中怎么写的问题。

python的memoryview和JavaScript的DataView在名字上就有点相似。

其实它们确实差不多...

可以这样对应一下:

  • ArrayBuffer <---> bytes
  • DataView <---> memoryview

先看一下ArrayBuffer的样子:
2020-09-16T08:41:36.png

与python的bytes不同的是它有4个可索引的合集对象(而且还套娃),便于一些计算。
在js转py的过程中这很不方便,然后一种个人认为比较合理的方式如下(后知后觉),那就是用struct来解析。

提前说明:

  • !是指按大端解析,js里面(ArrayBuffer)看到那些数也是基于大端
  • 数字加字符是指按该字符对应模式解析这么多次,但对于数字加字符s指的是这么多个字节
  • unpack_from是在指定的offset处按格式字符串解析,不用考虑格式字符串对应的字节数与实际bytes大小相同
  • ArrayBuffer中Uint8Array对应struct格式字符是I,Uint8Array中U是无符号的意思,8是指单个元素的值最大不超过2^8也就是小于256,struct中标准大小*8就是这个值。具体参见文档,或者下面截图。

2020-09-16T09:01:06.png

在下面这个例子中,对bytes对象buffer,从位置5开始,以大端方式按两个unsigned int,3个字符,一个整数(0-255)的形式解析:

>>> buffer = b"123" * 6
>>> struct.unpack_from("!2l3cB", buffer, offset=5)
(858862131, 825373489, b'2', b'3', b'1', 50)

js中Uint8Array是纯数字的,所以可以把上面的3c换成3B,这个结果在js中就是new Uint8Array([858862131, 825373489, 50, 51, 49, 50])
2020-09-16T09:09:14.png

DataView与memoryview

DataView的byteLength、byteOffset、buffer
对应
memoryview的nbytes、shape、obj

...写到这里感觉之前写的脚本又有好多地方可以优化了。。