`
RednaxelaFX
  • 浏览: 3067826 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

Quartett!文本插入程序

阅读更多
年初写的Quartett!的文本提取程序的下文就在此:文本插入程序。
荒废了N久的ScriptInserter终于做了 OTL

使用方法:
把编过号的*.tkn文件、ScriptInserter.exe与前面提到的文本提取程序提取出来的*.txt文件放在同一目录下(下面假设目录路径为D:\test\)。然后执行命令:
ScriptInserter textfile.txt

这样就会在名为new的子目录(假设是D:\test\new\)里得到目标*.tkn文件。

接下来……直接发代码吧。这代码基本上就是提取程序加了十来行代码的样子吧,基本逻辑几乎一模一样所以也没代码什么需要详细说明的。
主要的逻辑是:
0、校验相关文件是否存在,并创建一个名为new的子目录
1、校验*.tkn文件的signature,正确的话将signature也写入新的文件
2、获取总的token数,并写入新的文件
3、对每个token,
a、读入行号,并写入新文件
b、读入token类型,并写入新文件
c、读入token的值,并根据token类型来转换当前的程序状态;依据状态来决定写入原tkn的token值还是从txt读入文本写入新文件
4、结束

// ScriptInserter.cs, 2008/06/21
// by RednaxelaFX

/*
 * Copyright (c) 2008 著作权由RednaxelaFX所有。著作权人保留一切权利。
 * 
 * 这份授权条款,在使用者符合以下三条件的情形下,授予使用者使用及再散播本
 * 软件包装原始码及二进位可执行形式的权利,无论此包装是否经改作皆然:
 * 
 * * 对于本软件源代码的再散播,必须保留上述的版权宣告、此三条件表列,以
 *   及下述的免责声明。
 * * 对于本套件二进位可执行形式的再散播,必须连带以文件以及/或者其他附
 *   于散播包装中的媒介方式,重制上述之版权宣告、此三条件表列,以及下述
 *   的免责声明。
 * * 未获事前取得书面许可,不得使用RednaxelaFX之名称,
 *   来为本软件之衍生物做任何表示支持、认可或推广、促销之行为。
 * 
 * 免责声明:本软件是由RednaxelaFX以现状("as is")提供,
 * 本软件包装不负任何明示或默示之担保责任,包括但不限于就适售性以及特定目
 * 的的适用性为默示性担保。RednaxelaFX无论任何条件、
 * 无论成因或任何责任主义、无论此责任为因合约关系、无过失责任主义或因非违
 * 约之侵权(包括过失或其他原因等)而起,对于任何因使用本软件包装所产生的
 * 任何直接性、间接性、偶发性、特殊性、惩罚性或任何结果的损害(包括但不限
 * 于替代商品或劳务之购用、使用损失、资料损失、利益损失、业务中断等等),
 * 不负任何责任,即在该种使用已获事前告知可能会造成此类损害的情形下亦然。
 */

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace FFDSystemAnalysis
{
    enum TokenType
    {
        Decimal = 0x080,
        Identifier = 0x081,
        Hexadecimal = 0x082,
        String = 0x083,
        Operator = 0x085
    }
    
    enum OutputState
    {
    	Searching,
    	FoundText,
    	FoundEqual
    }

    sealed class ScriptInserter
    {
        private static readonly byte[ ] SIGNATURE = {
		    ( byte )0x54, ( byte )0x4F, ( byte )0x4B, ( byte )0x45,
		    ( byte )0x4E, ( byte )0x53, ( byte )0x45, ( byte )0x54,
		    ( byte )0x64, ( byte )0x0,  ( byte )0x0,  ( byte )0x0
        };

        static void Main( string[ ] args ) {
            string infile = args[ 0 ];
            if ( !infile.EndsWith( ".txt" ) ) return;
            if ( !File.Exists( infile ) ) return;

            string srcfile = Path.GetFileNameWithoutExtension( infile ) + ".tkn";
            if ( !File.Exists( srcfile ) ) return;
            string outfile = "./new/" + Path.GetFileNameWithoutExtension( infile ).Substring( 4 ) + ".tkn";
            Directory.CreateDirectory( "./new" );

            Encoding utf16le = new UnicodeEncoding( false, true );
            Encoding jis = Encoding.GetEncoding( 932 );
            Encoding gbk = Encoding.GetEncoding( 936 );

            using ( BinaryReader srcreader = new BinaryReader( File.OpenRead( srcfile ), jis ) ) {
                using ( StreamReader inreader = new StreamReader( infile, utf16le) ) {
                    using ( BinaryWriter writer = new BinaryWriter( File.Create( outfile ), gbk ) ) {
                        byte[ ] sig = srcreader.ReadBytes( SIGNATURE.Length );
                        if ( !Equals( sig, SIGNATURE ) ) {
                            Console.WriteLine( "Wrong signature" );
                            return;
                        }
    
                        // write UTF-16LE BOM
                        writer.Write( SIGNATURE );
    
                        // process each token
                        int lineNum = 1;
                        OutputState state = OutputState.Searching;
                        int tokenCount = srcreader.ReadInt32( );
                        writer.Write( tokenCount );
                        
                        for ( int tokenNum = 0; tokenNum < tokenCount; ++tokenNum ) {
                            // get line number
                            lineNum = srcreader.ReadInt32( );
                            writer.Write( lineNum );
    
                            // get tokenType
                            TokenType tokenType = ( TokenType ) ( srcreader.ReadByte( ) & 0x0FF );
                            writer.Write( ( byte ) tokenType );
    
                            // get token value
                            string tokenString = ReadCString( srcreader );
    
                            switch ( tokenType ) {
                            
                            case TokenType.Identifier:
                                if ( tokenString.Equals("text") ) {
                                	state = OutputState.FoundText;
                                } else {
                                	state = OutputState.Searching;
                                }
                                writer.Write( gbk.GetBytes( tokenString ) );
                                writer.Write( ( byte ) 0 );
                                break;
    
                            case TokenType.String:
                                if (OutputState.FoundEqual == state)
                                {
                                    int inLinenum = Convert.ToInt32( inreader.ReadLine( ) );
                                	if ( lineNum != inLinenum ) throw new Exception( "Line number doesn't match." );
                                	string inText = inreader.ReadLine( );
                                	writer.Write( gbk.GetBytes( inText ) );
                                    writer.Write( ( byte ) 0 );
                                	state = OutputState.Searching;
                                } else {
                                    writer.Write( gbk.GetBytes( tokenString ) );
                                    writer.Write( ( byte ) 0 );
                                }
                                break;
    
                            case TokenType.Operator:
                                if ((OutputState.FoundText == state)
                                    && tokenString.Equals("=")) {
                                	state = OutputState.FoundEqual;
                                } else {
                                	state = OutputState.Searching;
                                }
                                writer.Write( gbk.GetBytes( tokenString ) );
                                writer.Write( ( byte ) 0 );
                                break;
                            
                            case TokenType.Decimal:
                            case TokenType.Hexadecimal:
                                writer.Write( gbk.GetBytes( tokenString ) );
                                writer.Write( ( byte ) 0 );
                                break;
                                
                            default:
                                Console.WriteLine( "Unexpected token type {0} at 0x{1}.",
                                    tokenType.ToString( "X" ),
                                    srcreader.BaseStream.Position.ToString( "X" ) );
                                return;
                            } // switch tokenType
                        } // for
                    }
                }
            }
        }

        static bool Equals( byte[ ] a, byte[ ] b ) {
            int len = a.Length;
            if ( len != b.Length ) return false;
            for ( int i = 0; i < len; i++ ) {
                if ( a[ i ] != b[ i ] ) return false;
            }
            return true;
        }

        static string ReadCString( BinaryReader srcreader ) {
            StringBuilder builder = new StringBuilder( );
            char c = '\0';

            while ( ( c = srcreader.ReadChar( ) ) != '\0' ) {
                builder.Append( c );
            }

            return builder.ToString( );
        }
    }
}
分享到:
评论

相关推荐

    quartett-app

    "quartett-app" 是一个基于Java开发的项目,它是一个响应式的网页游戏,灵感来源于经典的超级Trumpf游戏。这个游戏的特色在于它结合了蒂罗尔地区城市的文化元素,为玩家提供了一种新颖且富有地方特色的卡牌游戏体验...

    无线电能传输中电动汽车充电的Matlab与Maxwell仿真:线圈结构与补偿拓扑优化

    内容概要:本文详细介绍了无线电能传输技术在电动汽车充电中的应用,特别是在Matlab和Maxwell中的仿真过程。首先讨论了SS补偿拓扑的Matlab仿真,展示了如何设置线圈参数、进行谐振匹配以及通过相量分析判断软开关状态。接着探讨了Maxwell中DD线圈的3D电磁场仿真,强调了自定义网格划分和涡流场计算的重要性。随后,文章深入研究了多线圈阵列仿真,揭示了不同线圈布局对耦合系数的影响,并提出了LCC补偿拓扑的应用。此外,文中还分享了许多实用技巧,如避免常见错误、优化仿真参数以及处理实际测试中的问题。 适合人群:从事无线电能传输研究的技术人员、研究生及以上学历的研究人员。 使用场景及目标:适用于需要深入了解无线电能传输技术及其仿真的研究人员和技术开发者,旨在帮助他们掌握Matlab和Maxwell的具体应用,提高仿真精度和效率。 其他说明:文章不仅提供了详细的代码示例和仿真步骤,还分享了作者的实际经验和教训,使读者能够更好地理解和应对仿真过程中遇到的问题。

    用户增删改查功能的前端页面,添加了vue渲染代码

    用户增删改查功能的前端页面,添加了vue渲染代码。

    计算机课程设计相关资源

    计算机课程设计相关资源

    基于51单片机protues仿真的猜数字游戏(仿真图、源代码、AD原理图、流程图)

    基于51单片机protues仿真的猜数字游戏(仿真图、源代码、AD原理图、流程图) 猜数字游戏 1、通过随机数实现该游戏; 2、按下K1键启动游戏并随机生成一个0~9的数字 3、通过矩阵按键输入你的数字,输入数字小于随机生成的数字则显示小于该数,大于的时候显示大于该数,直到相等为止。 4、仿真图、源代码、AD原理图、流程图;

    基于MATLAB的FOC滑膜观测器与锁相环(MATLAB 2021b)实现及硬件移植注意事项

    内容概要:本文详细介绍了利用MATLAB 2021b搭建的FOC滑膜观测器(SMO)与锁相环(PLL)的仿真模型及其在M4硬件平台上的实现方法。文中首先展示了SMO的核心代码,解释了如何通过滑模面计算和符号函数处理来估算反电动势,并讨论了PLL用于速度提取的具体实现。接着探讨了仿真环境中直接0速闭环启动的效果以及实际硬件实现时所需的开环启动策略。此外,文章还分享了多个调试过程中遇到的问题及解决方案,如相位跳变、高频振荡、电流环参数调整等。 适合人群:从事电机控制研究的技术人员,尤其是对无感FOC感兴趣的工程师。 使用场景及目标:适用于希望深入了解FOC滑膜观测器和锁相环的工作原理并尝试将其应用于实际项目的开发者。目标是掌握SMO+PLL组合的设计思路和技术细节,同时了解硬件移植时需要注意的实际问题。 其他说明:文中提供了大量实用的代码片段和调试经验,对于想要快速入门或优化现有系统的读者非常有帮助。特别强调了仿真与现实之间的差异,提醒读者注意参数选择和滤波器设计等方面的不同之处。

    汽车美容员工手册.doc

    汽车美容员工手册.doc

    基于PSO算法的配电网分布式光伏选址定容优化及其Matlab实现

    内容概要:本文详细介绍了利用粒子群优化(PSO)算法解决配电网中分布式光伏系统的选址与定容问题的方法。首先阐述了问题背景,即在复杂的配电网环境中选择合适的光伏安装位置和确定合理的装机容量,以降低网损、减小电压偏差并提高光伏消纳效率。接着展示了具体的PSO算法实现流程,包括粒子初始化、适应度函数构建、粒子位置更新规则以及越界处理机制等关键技术细节。文中还讨论了目标函数的设计思路,将多个相互制约的目标如网损、电压偏差和光伏消纳通过加权方式整合为单一评价标准。此外,作者分享了一些实践经验,例如采用前推回代法进行快速潮流计算,针对特定应用场景调整权重系数,以及引入随机波动模型模拟光伏出力特性。最终实验结果显示,经过优化后的方案能够显著提升系统的整体性能。 适用人群:从事电力系统规划与设计的专业人士,尤其是那些需要处理分布式能源集成问题的研究人员和技术人员。 使用场景及目标:适用于希望深入了解如何运用智能优化算法解决实际工程难题的人士;旨在帮助读者掌握PSO算法的具体应用方法,从而更好地应对配电网中分布式光伏系统的选址定容挑战。 其他说明:文中提供了完整的Matlab源代码片段,便于读者理解和复现研究结果;同时也提到了一些潜在改进方向,鼓励进一步探索和创新。

    晋升考核制度.pptx

    晋升考核制度.pptx

    计网-主机发送IP数据报的过程思维导图

    计网-主机发送IP数据报的过程思维导图

    三菱FX3U PLC与三台E740变频器基于Modbus RTU通讯的工业自动化控制系统实现

    内容概要:本文详细介绍了三菱FX3U PLC与三台三菱E740变频器通过Modbus RTU协议进行通讯的具体实现方法。主要内容涵盖硬件配置(如PLC、变频器、触摸屏)、通讯参数设置(如波特率、数据位、校验方式)、PLC程序编写(包括初始化、启停控制、频率设定等)、触摸屏编程(如画面设计、变量关联)等方面。文中还分享了一些实际应用中的注意事项和避坑指南,确保通讯系统的稳定性和可靠性。 适用人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉三菱产品和Modbus RTU协议的专业人士。 使用场景及目标:适用于需要实现PLC与多台变频器通讯的工业自动化项目,旨在提高系统的集成度和可控性,减少人工干预,提升生产效率。 其他说明:文中提供的实例和代码片段有助于读者快速理解和掌握相关技术要点,同时强调了实际操作中的常见问题及其解决方案。

    自动驾驶路径跟踪:基于二/三自由度动力学模型的MPC算法及Carsim-Simulink联合仿真

    内容概要:本文深入探讨了利用二/三自由度动力学模型和MPC(模型预测控制)实现自动驾驶车辆的任意路径跟踪技术。首先介绍了二自由度动力学模型的基本概念及其状态方程,随后详细解释了MPC的工作原理,包括目标函数的设计和优化求解过程。接着讨论了Carsim和Simulink联合仿真的具体实施步骤和技术要点,如采样同步、约束条件处理等。文中还分享了许多实用的工程经验和调试技巧,例如预瞄距离的设置、权重矩阵的选择以及如何应对高速工况下的挑战。最终通过仿真结果展示,证明了该方法的有效性和优越性。 适合人群:从事自动驾驶研究与开发的专业人士,尤其是对路径跟踪算法感兴趣的工程师和技术爱好者。 使用场景及目标:适用于需要精确路径跟踪的自动驾驶应用场景,旨在提高车辆行驶的安全性和效率。通过掌握本文介绍的方法和技术,可以帮助开发者更好地理解和实现基于MPC的路径跟踪系统。 其他说明:文章不仅提供了理论知识,还包括了大量的实战经验和代码片段,有助于读者快速上手并应用于实际项目中。同时强调了在不同速度范围选择合适自由度模型的重要性,为后续的研究和发展指明了方向。

    基于博途1200PLC的智能灌溉系统设计与实现 - 自动化农业应用

    内容概要:本文详细介绍了基于西门子S7-1200 PLC的智能灌溉系统的设计与实现。系统主要包括PLC控制器、触摸屏、传感器和执行机构。文中详细讲解了如何使用博途V16软件编写PLC程序,包括梯形图编程和SCL语言的应用,以及如何设计触摸屏监控画面。此外,还涉及了IO表和电气原理图的准备,确保系统的正确安装和维护。文章特别强调了自动灌溉的核心逻辑,如状态机结构和异常处理机制,以及触摸屏设计的小技巧,如动态图标和趋势图的使用。最后,提供了调试过程中的一些注意事项和优化建议。 适合人群:从事农业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和触摸屏设计的专业人士。 使用场景及目标:适用于需要提高灌溉效率和精度的现代农业生产环境。目标是通过智能化控制减少水资源浪费,提升作物产量。同时,也为系统开发者提供了详细的实施指南和调试技巧。 其他说明:文章附带了完整的PLC程序、HMI界面和电气图纸,方便读者进行实际操作和验证。

    MINIQMT学习课程Day5

    国金qmt模拟客户端。 模拟账号密码,私聊。

    员工离职面谈记录表.doc

    员工离职面谈记录表.doc

    新员工关怀方案.doc

    新员工关怀方案

    轴承表面缺陷检测数据集解析:基于Python的图像处理与模型训练

    内容概要:本文详细介绍了轴承表面缺陷检测数据集的结构及其应用方法。数据集包含5824张高清轴承图像及其对应的XML标注文件,涵盖擦伤、凹槽、划痕三种类型的缺陷。作者通过Python代码展示了如何检查数据完整性、解析XML标注文件、进行数据可视化以及数据增强操作。此外,还讨论了使用YOLOv5和EfficientDet等模型进行缺陷检测的具体步骤和技术要点,强调了高分辨率图像处理和模型优化的方法。 适合人群:从事工业质检、机器视觉、深度学习等相关领域的研究人员和工程师。 使用场景及目标:适用于需要处理高分辨率工业图像并进行缺陷检测的研究和工程项目。主要目标是提高缺陷检测的准确性,特别是在复杂的工业环境中。 其他说明:文中提供了大量实用的Python代码片段,涵盖了从数据预处理到模型训练的各个环节。特别提到了针对金属表面反光、多缺陷共存等问题的技术解决方案。

    招聘甘特图.xlsx

    招聘甘特图.xlsx

    招聘仪表盘构建及为数据解读P11.pptx

    招聘仪表盘构建及为数据解读P11.pptx

Global site tag (gtag.js) - Google Analytics