吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 877|回复: 5
收起左侧

[其他求助] 有大佬帮忙下吗? C#代码转易语言代码

[复制链接]
a5570622 发表于 2025-2-14 10:34
25吾爱币
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;

namespace TS_Server.DataTools
{
    public static class SwapitemData
    {
        public static Dictionary<byte, SwapitemInfos> swapitemInfoDatas = new Dictionary<byte, SwapitemInfos>();

        public static T ReadFromItems<T>(Stream fs)
        {
            byte[] buffer = new byte[Marshal.SizeOf(typeof(T))];
            fs.Read(buffer, 0, Marshal.SizeOf(typeof(T)));
            GCHandle Handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
            T RetVal = (T)Marshal.PtrToStructure(Handle.AddrOfPinnedObject(), typeof(T));
            Handle.Free();
            return RetVal;
        }

        public static bool loadItems()
        {
            try
            {
                swapitemInfoDatas?.Clear();

                swapitemInfoDatas = new Dictionary<byte, SwapitemInfos>();
            
                using (FileStream fileStream = new FileStream("SwapItem.dat", FileMode.Open, FileAccess.Read))
                {
                    long length = fileStream.Length;
                    byte[] swapitemDatas = new byte[length];
                    fileStream.Read(swapitemDatas, 0, (int)length);
                    fileStream.Close();

                    DatReader swapDatReader = new DatReader(swapitemDatas);
                    swapDatReader.DecodeAll();

                    Stream stream = new MemoryStream(swapDatReader.decodedData);
                    for (int i = 0; i < swapDatReader.count; i++)
                    {
                        SwapitemInfos swapitemInfos = ReadFromItems<SwapitemInfos>(stream);
                        swapitemInfoDatas.Add((byte)i, swapitemInfos);
                    }
                }
                return true;
            }
            catch (Exception)
            {

                return false;
            }

        }

        /// <summary>
        /// 获取需要增加的Item, 输入月份和顺序
        /// </summary>
        /// <param name="month"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        public static ushort GetAddItem(byte month,byte index)
        {
            swapitemInfoDatas.TryGetValue((byte)(month - 1), out SwapitemInfos swapitemInfos);
            if(swapitemInfos.list.Length >= index)
            {
                return swapitemInfos.list[index].id1;
            }
            return 0;
        }

        /// <summary>
        /// 获取需要增加的Item, 输入月份和顺序
        /// </summary>
        /// <param name="month"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        public static SwapitemInfo GetSwapitemInfo(byte month, byte index)
        {
            swapitemInfoDatas.TryGetValue((byte)(month - 1), out SwapitemInfos swapitemInfos);
            return swapitemInfos.list[index-1];

        }


    }
}



    public void DecodeAll()
    {
        position = 0;
        size = ReadInt32(bigEndian: false, signed: false);
        count = ReadInt32(bigEndian: false, signed: false);
        keys[0] = ReadBytes(size, count + 1);
        keys[1] = ReadBytes(size, count + 2);
        int decodeIndex = 0;
        decodedData = new byte[count * size];
        for (int i = 1; i <= count; i++)
        {
            decodeIndex = i % 2;
            byte[] tempData = ReadBytes(size, i);
            tempData = TransformBytes(tempData, keys[decodeIndex]);
            Array.Copy(tempData, 0, decodedData, size * (i - 1), size);
        }
        position = 0;
    }


有大佬帮忙下吗?  C#代码转易语言代码
主要是读取文件然后把信息加到数组

发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

不知名设计师 发表于 2025-2-14 16:02
[Asm] 纯文本查看 复制代码
.版本 2
.程序集 SwapitemData
.程序集变量 swapitemInfoDatas, 整数型, , "256"  ' 用数组模拟字典,索引0-255对应月份-1

.子程序 loadItems, 逻辑型
.局部变量 fileStream, 整数型
.局部变量 swapitemDatas, 字节集
.局部变量 swapDatReader, 解码器
.局部变量 stream, 整数型
.局部变量 i, 整数型
.局部变量 swapitemInfos, SwapitemInfos

    OnError("错误处理")
    ' 清空原有数据
    .计次循环首 (256, i)
        swapitemInfoDatas [i-1] = 0
    .计次循环尾 ()

    fileStream = 打开文件 ("SwapItem.dat", #读入, )
    .如果真 (fileStream = 0)
        返回 (假)
    .如果真结束
    swapitemDatas = 读入字节集 (fileStream, 取文件长度 (fileStream))
    关闭文件 (fileStream)

    swapDatReader = 创建解码器 (swapitemDatas)
    解码全部 (swapDatReader)

    stream = 创建内存流 (swapDatReader.decodedData)
    .计次循环首 (swapDatReader.count, i)
        swapitemInfos = 读取结构体 (stream, 取结构体大小 (SwapitemInfos))
        swapitemInfoDatas [i-1] = swapitemInfos  ' 需根据实际结构转换
    .计次循环尾 ()
    返回 (真)

.子程序 错误处理
    返回 (假)

' 解码器相关结构
.数据类型 解码器
    .成员 position, 整数型
    .成员 size, 整数型
    .成员 count, 整数型
    .成员 keys, 字节集, , "2"
    .成员 decodedData, 字节集

.子程序 创建解码器, 解码器, 公开
.参数 data, 字节集
.局部变量 dr, 解码器
    dr.position = 0
    dr.size = 取字节集数据 (data, #整数型, dr.position)
    dr.position = dr.position + 4
    dr.count = 取字节集数据 (data, #整数型, dr.position)
    dr.position = dr.position + 4
    dr.keys [0] = 取字节集中间 (data, dr.position, dr.size × (dr.count + 1))
    dr.position = dr.position + dr.size × (dr.count + 1)
    dr.keys [1] = 取字节集中间 (data, dr.position, dr.size × (dr.count + 2))
    dr.position = dr.position + dr.size × (dr.count + 2)
    返回 (dr)

.子程序 解码全部, 整数型
.参数 dr, 解码器
.局部变量 i, 整数型
.局部变量 tempData, 字节集
.局部变量 decodeIndex, 整数型
    dr.decodedData = 取空白字节集 (dr.count × dr.size)
    .计次循环首 (dr.count, i)
        decodeIndex = i % 2
        tempData = 取字节集中间 (dr.data, (i-1) × dr.size + 1, dr.size)
        tempData = 转换字节 (tempData, dr.keys [decodeIndex])
        替换字节集中间 (dr.decodedData, (i-1) × dr.size + 1, dr.size, tempData)
    .计次循环尾 ()

' 结构体转换示例(需根据实际结构调整)
.数据类型 SwapitemInfos
    .成员 list, SwapitemInfo, , "数组长度根据实际情况"

.数据类型 SwapitemInfo
    .成员 id1, 短整数型
    .成员 其他字段, 数据类型  ' 根据实际情况补充

.子程序 读取结构体, SwapitemInfos
.参数 stream, 整数型
.参数 size, 整数型
.局部变量 data, 字节集
.局部变量 result, SwapitemInfos
    data = 读入字节集 (stream, size)
    ' 手动解析字节集到结构体
    result.list [0].id1 = 取字节集数据 (data, #短整数型, 0)  ' 假设id1在偏移0位置
    ' 其他字段解析...
    返回 (result)

.子程序 GetAddItem, 短整数型
.参数 month, 字节型
.参数 index, 字节型
.局部变量 info, SwapitemInfos
    info = swapitemInfoDatas [month - 1]
    .如果 (取数组成员数 (info.list) ≥ index)
        返回 (info.list [index - 1].id1)
    .否则
        返回 (0)


注意事项:

需要根据实际文件结构完善SwapitemInfos和SwapitemInfo的数据类型

转换字节函数需要根据C#中的TransformBytes逻辑实现

内存流操作可能需要使用易语言的指针操作

字典用数组模拟时需要注意索引越界问题

字节序问题需要根据原始数据格式处理

错误处理部分需要根据实际需求完善

建议实现时:

使用易语言的读入字节集和取字节集数据进行二进制解析

对于复杂结构体需要手动计算偏移量

加密算法需要逆向C#中的TransformBytes具体实现

添加必要的异常处理和日志输出

 楼主| a5570622 发表于 2025-2-14 18:15
本帖最后由 a5570622 于 2025-2-14 18:17 编辑

https://yiyuan.lanzouv.com/ir1O52ns6ffa

这个是文件



 楼主| a5570622 发表于 2025-2-15 00:07
不知名设计师 发表于 2025-2-14 16:02
[mw_shl_code=asm,true].版本 2
.程序集 SwapitemData
.程序集变量 swapitemInfoDatas, 整数型, , "256"  ...

执行不了
shuya41521 发表于 2025-2-15 03:42
以下是将提供的C#代码转换为易语言代码的示例实现:

```easycode
.版本 2
.程序集 程序集_数据工具
.程序集变量 swapitemInfoDatas, 交换物品信息, , "0"

.数据类型 交换物品信息
    .成员 月份, 字节型
    .成员 物品列表, 物品信息, , "12"  ' 假设每月最多12个物品

.数据类型 物品信息
    .成员 需求物品ID, 短整数型
    .成员 兑换物品ID, 短整数型

.子程序 加载交换物品数据, 逻辑型
.局部变量 文件数据, 字节集
.局部变量 内存流, 整数型
.局部变量 size, 整数型
.局部变量 count, 整数型
.局部变量 keys, 字节集, , "2"
.局部变量 i, 整数型
.局部变量 解密数据, 字节集
.局部变量 当前月份数据, 交换物品信息

    ' 读取文件内容
    文件数据 = 读入文件 ("SwapItem.dat")
    .如果真 (文件数据 = { })
        返回 假
    .如果真结束

    ' 解析基础信息
    size = 取字节集数据 (文件数据, #整数型, 1)
    count = 取字节集数据 (文件数据, #整数型, 5)

    ' 读取密钥数据
    keys [1] = 取字节集中间 (文件数据, 9, (count + 1) × size)
    keys [2] = 取字节集中间 (文件数据, 9 + (count + 1) × size, (count + 2) × size)

    ' 解密处理
    解密数据 = 解密数据流 (文件数据, 9 + (count + 1) × size + (count + 2) × size, size, count, keys)

    ' 解析结构数据
    重定义数组 (swapitemInfoDatas, 假, count)
    .计次循环首 (count, i)
        当前月份数据.月份 = i - 1
        解析物品列表 (解密数据, (i - 1) × size, 当前月份数据.物品列表)
        swapitemInfoDatas [i] = 当前月份数据
    .计次循环尾 ()

    返回 真

.子程序 解密数据流, 字节集
.参数 原始数据, 字节集
.参数 起始位置, 整数型
.参数 块大小, 整数型
.参数 块数量, 整数型
.参数 密钥数组, 字节集
.局部变量 结果数据, 字节集
.局部变量 i, 整数型
.局部变量 当前块, 字节集
.局部变量 密钥索引, 整数型

    结果数据 = 取空白字节集 (块大小 × 块数量)
    .计次循环首 (块数量, i)
        当前块 = 取字节集中间 (原始数据, 起始位置 + (i - 1) × 块大小, 块大小)
        密钥索引 = 选择 (i % 2 = 0, 2, 1)
        当前块 = 字节异或处理 (当前块, 密钥数组 [密钥索引])
        替换字节集中间 (结果数据, (i - 1) × 块大小 + 1, 块大小, 当前块)
    .计次循环尾
    返回 结果数据

.子程序 字节异或处理, 字节集
.参数 输入数据, 字节集
.参数 密钥数据, 字节集
.局部变量 结果, 字节集
.局部变量 i, 整数型
.局部变量 密钥长度, 整数型

    结果 = 输入数据
    密钥长度 = 取字节集长度 (密钥数据)
    .如果真 (密钥长度 = 0)
        返回 输入数据
    .如果真结束

    .计次循环首 (取字节集长度 (输入数据), i)
        结果 [i] = 位异或 (输入数据 [i], 密钥数据 [(i - 1) % 密钥长度 + 1])
    .计次循环尾
    返回 结果

.子程序 解析物品列表
.参数 源数据, 字节集
.参数 偏移量, 整数型
.参数 结果列表, 物品信息, 参考 数组
.局部变量 i, 整数型

    重定义数组 (结果列表, 假, 12)  ' 假设每月12个物品
    .计次循环首 (12, i)
        结果列表 [i].需求物品ID = 取字节集数据 (源数据, #短整数型, 偏移量 + (i - 1) × 4 + 1)
        结果列表 [i].兑换物品ID = 取字节集数据 (源数据, #短整数型, 偏移量 + (i - 1) × 4 + 3)
    .计次循环尾

.子程序 获取兑换物品ID, 短整数型
.参数 月份, 字节型
.参数 序号, 字节型
.局部变量 月份索引, 整数型

    月份索引 = 月份 - 1
    .如果真 (月份索引 < 1 或 月份索引 > 取数组成员数 (swapitemInfoDatas))
        返回 0
    .如果真结束

    .如果真 (序号 < 1 或 序号 > 取数组成员数 (swapitemInfoDatas [月份索引].物品列表))
        返回 0
    .如果真结束

    返回 swapitemInfoDatas [月份索引].物品列表 [序号].兑换物品ID
```

主要实现要点说明:

1. 数据结构定义:
- 使用易语言的`数据类型`来定义交换物品信息结构
- 每月数据包含12个物品兑换信息(根据常见游戏设定)

2. 文件解析流程:
- 使用`读入文件`读取原始数据
- 解析文件头获取块大小和数量
- 读取密钥数据进行异或解密
- 使用循环结构处理每个数据块

3. 解密处理:
- 实现字节级的异或解密逻辑
- 根据块索引自动选择解密密钥
- 支持动态密钥长度循环使用

4. 数据访问接口:
- 提供根据月份和序号获取物品ID的功能
- 包含完整的越界检查逻辑

注意:需要根据实际文件结构调整以下参数:
1. 每月最大物品数量(示例假设为12)
2. 物品信息结构体大小(示例按4字节处理)
3. 密钥数据的存储位置和长度计算
4. 字节序处理方式(示例使用小端模式)

建议在实际使用时:
1. 添加详细的日志输出
2. 加强异常处理机制
3. 根据实际文件结构调整偏移量计算
4. 增加数据校验机制
 楼主| a5570622 发表于 2025-2-16 02:00
shuya41521 发表于 2025-2-15 03:42
以下是将提供的C#代码转换为易语言代码的示例实现:

```easycode

能传个源吗?  没有找到替换字节集中间
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-10-24 03:17

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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