开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 568|回复: 7
打印 上一主题 下一主题
收起左侧

[讨论] 家人们 求助 这个代码可以转写成易语言吗

[复制链接]
结帖率:100% (8/8)
跳转到指定楼层
楼主
发表于 3 天前 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式   云南省昆明市
class MessagePackDecoder:
    """MessagePack解码器的纯Python实现"""

    def __init__(self, data: bytes):
        self.data = data
        self.pos = 0
        self.length = len(data)

    def read_byte(self) -> int:
        if self.pos >= self.length:
            raise ValueError("Unexpected end of data")
        byte = self.data[self.pos]
        self.pos += 1
        return byte

    def read_bytes(self, count: int) -> bytes:
        if self.pos + count > self.length:
            raise ValueError("Unexpected end of data")
        result = self.data[self.pos:self.pos + count]
        self.pos += count
        return result

    def read_uint8(self) -> int:
        return self.read_byte()

    def read_uint16(self) -> int:
        return struct.unpack('>H', self.read_bytes(2))[0]

    def read_uint32(self) -> int:
        return struct.unpack('>I', self.read_bytes(4))[0]

    def read_uint64(self) -> int:
        return struct.unpack('>Q', self.read_bytes(8))[0]

    def read_int8(self) -> int:
        return struct.unpack('>b', self.read_bytes(1))[0]

    def read_int16(self) -> int:
        return struct.unpack('>h', self.read_bytes(2))[0]

    def read_int32(self) -> int:
        return struct.unpack('>i', self.read_bytes(4))[0]

    def read_int64(self) -> int:
        return struct.unpack('>q', self.read_bytes(8))[0]

    def read_float32(self) -> float:
        return struct.unpack('>f', self.read_bytes(4))[0]

    def read_float64(self) -> float:
        return struct.unpack('>d', self.read_bytes(8))[0]

    def read_string(self, length: int) -> str:
        return self.read_bytes(length).decode('utf-8')

    def decode_value(self) -> Any:
        """解码单个MessagePack值"""
        if self.pos >= self.length:
            raise ValueError("Unexpected end of data")

        format_byte = self.read_byte()

        # Positive fixint (0xxxxxxx)
        if format_byte <= 0x7f:
            return format_byte

        # Fixmap (1000xxxx)
        elif 0x80 <= format_byte <= 0x8f:
            size = format_byte & 0x0f
            return self.decode_map(size)

        # Fixarray (1001xxxx)
        elif 0x90 <= format_byte <= 0x9f:
            size = format_byte & 0x0f
            return self.decode_array(size)

        # Fixstr (101xxxxx)
        elif 0xa0 <= format_byte <= 0xbf:
            size = format_byte & 0x1f
            return self.read_string(size)

        # nil
        elif format_byte == 0xc0:
            return None

        # false
        elif format_byte == 0xc2:
            return False

        # true
        elif format_byte == 0xc3:
            return True

        # bin 8
        elif format_byte == 0xc4:
            size = self.read_uint8()
            return self.read_bytes(size)

        # bin 16
        elif format_byte == 0xc5:
            size = self.read_uint16()
            return self.read_bytes(size)

        # bin 32
        elif format_byte == 0xc6:
            size = self.read_uint32()
            return self.read_bytes(size)

        # float 32
        elif format_byte == 0xca:
            return self.read_float32()

        # float 64
        elif format_byte == 0xcb:
            return self.read_float64()

        # uint 8
        elif format_byte == 0xcc:
            return self.read_uint8()

        # uint 16
        elif format_byte == 0xcd:
            return self.read_uint16()

        # uint 32
        elif format_byte == 0xce:
            return self.read_uint32()

        # uint 64
        elif format_byte == 0xcf:
            return self.read_uint64()

        # int 8
        elif format_byte == 0xd0:
            return self.read_int8()

        # int 16
        elif format_byte == 0xd1:
            return self.read_int16()

        # int 32
        elif format_byte == 0xd2:
            return self.read_int32()

        # int 64
        elif format_byte == 0xd3:
            return self.read_int64()

        # str 8
        elif format_byte == 0xd9:
            size = self.read_uint8()
            return self.read_string(size)

        # str 16
        elif format_byte == 0xda:
            size = self.read_uint16()
            return self.read_string(size)

        # str 32
        elif format_byte == 0xdb:
            size = self.read_uint32()
            return self.read_string(size)

        # array 16
        elif format_byte == 0xdc:
            size = self.read_uint16()
            return self.decode_array(size)

        # array 32
        elif format_byte == 0xdd:
            size = self.read_uint32()
            return self.decode_array(size)

        # map 16
        elif format_byte == 0xde:
            size = self.read_uint16()
            return self.decode_map(size)

        # map 32
        elif format_byte == 0xdf:
            size = self.read_uint32()
            return self.decode_map(size)

        # Negative fixint (111xxxxx)
        elif format_byte >= 0xe0:
            return format_byte - 256  # Convert to signed

        else:
            raise ValueError(f"Unknown format byte: 0x{format_byte:02x}")

    def decode_array(self, size: int) -> List[Any]:
        """解码数组"""
        result = []
        for _ in range(size):
            result.append(self.decode_value())
        return result

    def decode_map(self, size: int) -> Dict[Any, Any]:
        """解码映射"""
        result = {}
        for _ in range(size):
            key = self.decode_value()
            value = self.decode_value()
            result[key] = value
        return result

    def decode(self) -> Any:
        """解码MessagePack数据"""
        try:
            return self.decode_value()
        except Exception as e:
            # 如果解码失败,返回原始数据的base64编码
            return base64.b64encode(self.data).decode('utf-8')


def decrypt(data: str) -> str:
    """解密函数的Python实现"""
    try:
        # 1. Base64解码
        # 清理非base64字符
        cleaned_data = ''.join(c for c in data if c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=')

        # 添加padding如果需要
        while len(cleaned_data) % 4 != 0:
            cleaned_data += '='

        try:
            decoded_bytes = base64.b64decode(cleaned_data)
        except Exception as e:
            # 如果base64解码失败,尝试其他方法
            return json.dumps({"error": f"Base64 decode failed: {str(e)}", "raw_data": data})

        # 2. 尝试MessagePack解码
        try:
            decoder = MessagePackDecoder(decoded_bytes)
            result = decoder.decode()

            # 3. 转换为JSON字符串
            def json_serializer(obj):
                """自定义JSON序列化器"""
                if isinstance(obj, bytes):
                    try:
                        return obj.decode('utf-8')
                    except:
                        return base64.b64encode(obj).decode('utf-8')
                elif hasattr(obj, '__dict__'):
                    return obj.__dict__
                else:
                    return str(obj)

            return json.dumps(result, ensure_ascii=False, default=json_serializer)

        except Exception as e:
            # 如果MessagePack解码失败,尝试直接解析为字符串
            try:
                text_result = decoded_bytes.decode('utf-8')
                return json.dumps({"text": text_result})
            except:
                # 最后的备选方案:返回十六进制表示
                hex_result = decoded_bytes.hex()
                return json.dumps({"hex": hex_result, "error": f"Decode failed: {str(e)}"})

    except Exception as e:
        return json.dumps({"error": f"Decrypt failed: {str(e)}", "raw_data": data})

点评

自己搞明白了   云南省昆明市  发表于 前天 20:14

签到天数: 5 天

7
发表于 3 天前 | 只看该作者   浙江省宁波市
ai转的 格式对吗
回复 支持 反对

使用道具 举报

6
发表于 3 天前 高大上手机用户 | 只看该作者   广东省广州市
b
回复 支持 反对

使用道具 举报

结帖率:100% (8/8)

签到天数: 9 天

地下
 楼主| 发表于 3 天前 | 只看该作者   云南省昆明市
东京热 发表于 2025-7-9 14:09
可以转的,很简单

可以帮个忙吗大佬 位运算搞不明白
回复 支持 反对

使用道具 举报

结帖率:100% (8/8)

签到天数: 9 天

地板
 楼主| 发表于 3 天前 | 只看该作者   云南省昆明市
指尖流淌 发表于 2025-7-9 14:32
找AI啊,现在多方便啊

用不了鸟
回复 支持 反对

使用道具 举报

结帖率:100% (16/16)

签到天数: 8 天

板凳
发表于 3 天前 | 只看该作者   广东省深圳市
找AI啊,现在多方便啊
回复 支持 1 反对 0

使用道具 举报

结帖率:89% (17/19)

签到天数: 12 天

沙发
发表于 3 天前 | 只看该作者   湖南省永州市
可以转的,很简单
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:[email protected]
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表