`

AbstractStringBuilder 类的 reverse 方法分析

阅读更多

说明:这段代码很有意思,它考虑到了 Unicode 的情况,我们如何写反转的话,两头循环,然后交换. 但是这只做了第一步,而 JDK源码中,它考虑到了还原 Unicode 的情况.

/**
     * 导致此字符序列被序列的反序替换. 如果序列中包含任何代理对,则将这些代理对视为反向操作的单个字符.
     * 因此,高低代理人的顺序永远不会逆转.(也就是说,这个方法将代码点当成了一个整体.)
     *
     * 在执行 reverse 方法之前,让 n 成为此字符序列的字符长度(不是 char 值中的长度).
     * 然后,新字符序列中索引 k 处的字符等于旧字符序列中索引 n-k-1 处的字符.
     *
     * 请注意,反向操作可能导致在操作之前产生代表对,即未配对的低代理和高代理.
     * 例如,反转“\ uDC00 \ uD800”会生成“\ uD800 \ uDC00”,这是一个有效的代理项对.
     *
     * @return  a reference to this object.
     */
    public AbstractStringBuilder reverse() {
        //是否含代理字符
        //高代理highSurrogate和低代理lowSurrogate概念请另查询char与Unicode字符
        boolean hasSurrogate = false;
        //定义一个变量表示长度-1
        int n = count - 1;
        //j初始化,长度-2再算术右移一位 j = (count-2)/2
        //偶数长度,遍历一半次数,对调替换
        //奇数长度,遍历一半-1次数,对调替换,中间值不用替换
        for (int j = (n-1) >> 1; j >= 0; --j) {
            char temp = value[j];
            char temp2 = value[n - j];
            //如果无代理
            if (!hasSurrogate) {
                hasSurrogate = (temp >= Character.MIN_SURROGATE && temp <= Character.MAX_SURROGATE)
                    || (temp2 >= Character.MIN_SURROGATE && temp2 <= Character.MAX_SURROGATE);
            }
            value[j] = temp2;
            value[n - j] = temp;
        }
        if (hasSurrogate) {
            // Reverse back all valid surrogate pairs
            // 反转回所有有效代理对
            // 高代理+低代理组合表示一个字符.
            for (int i = 0; i < count - 1; i++) {
                char c2 = value[i];
                // 这个方法就是把代码点的顺序调整对.
                if (Character.isLowSurrogate(c2)) {
                    char c1 = value[i + 1];
                    if (Character.isHighSurrogate(c1)) {
                        value[i++] = c1;
                        value[i] = c2;
                    }
                }
            }
        }
        return this;
    }
1
0
分享到:
评论

相关推荐

    js中reverse函数的用法详解

    JavaScript中的Array对象提供了很多有用的方法来操作数组,其中包括reverse方法。reverse方法是一个非常便捷的工具,用于将数组中的元素顺序进行颠倒。以下是对该方法的详细讲解: 首先,reverse方法直接作用于数组...

    java代码笔记2010-06-01:Java内部类 静态内部类 局部内部类 明明内部类;StringBuffer reverse的使用;

    以上内容涵盖了Java编程中的关键知识点,特别是内部类的分类及其特点,以及`StringBuffer`的`reverse()`方法的用法。理解并熟练运用这些概念对于编写高效、清晰的Java代码至关重要。在实际开发中,内部类常用于实现...

    reverse c++

    它采用了静态分析的方法来解析二进制文件,并应用一系列策略来识别类、构造函数、析构函数等。 2. **自动化分析策略:** - **利用RTTI识别多态类:** OOP_RE利用C++的RTTI机制来自动识别多态类。 - **利用虚函数...

    JS数组方法reverse()用法实例分析

    数组提供了许多内置的方法,其中一个重要的方法就是`reverse()`。这个方法的功能是反转数组中的元素顺序,即原本位于数组前面的元素会被移动到后面,反之亦然。 `reverse()`方法的定义如下: ```javascript arr....

    Scroll Reverse

    标题“Scroll Reverse”所指的是一个针对MacOS操作系统的应用程序,它的主要功能是解决用户在使用鼠标滚轮或触控板滚动时感到不便的问题。在MacOS系统中,默认情况下,滚轮向上滚动会向下移动页面,这与许多Windows...

    基于Java Reflection自动逆向生成类间方法关系图的解析器.pdf

    类方法关系图的建立,需要分析出类方法的名称、包含的参数、返回类型及方法之间的相互作用。当软件出现错误时,该关系图能帮助分析和定位故障的来源,从而采取相应的应对措施。 三、逆向工程(Reverse Engineering...

    Reverse&amp;Replace 字符串加密解密

    然而,这种基础的加密方式并不足够安全,因为对于熟练的黑客来说,可能存在破解的可能,如通过频率分析或其他已知的密码学攻击手段。因此,在实际的安全应用中,通常会结合更复杂的算法,如AES(高级加密标准)、RSA...

    9781788838849-MASTERING_REVERSE_ENGINEERING_reverseengineering_e

    Mastering Reverse Engineering

    Reverse C++ (逆向 C++)

    这部分重点介绍了手动分析C++可执行文件的方法,旨在帮助识别类、成员变量、成员函数(尤其是构造函数和析构函数),以及类之间的关系。 **A. 识别类及其构造函数** - **ECX寄存器的使用**:在反汇编代码中,如果...

    Python 列表排序方法reverse、sort、sorted详解

    python语言中的列表排序方法有三个:reverse反转/倒序排序、sort正序排序、sorted可以获取排序后的列表。在更高级列表排序中,后两中方法还可以加入条件参数进行排序。 reverse()方法 将列表中元素反转排序,比如...

    Reverse_Engineering_for_Beginners

    通过"Reverse_Engineering_for_Beginners"这本书,初学者将能够逐步掌握逆向工程的基本概念、方法和技术,为进一步深入学习和实践打下坚实基础。同时,书中可能还涵盖了如何使用一些常用的逆向工程工具,以及解决...

    即时通讯DWR Reverse Ajax

    使用DWR实现Reverse Ajax,首先需要在服务器端配置DWR,包括创建DWR的配置文件dwr.xml,设置允许访问的Java方法。然后在客户端,使用JavaScript的DWR API创建连接并注册回调函数,以接收服务器推送的数据。在服务器...

    Secrets of Reverse Engineering

    逆向工程,通常简称为RE,是一种技术过程,它涉及分析现有的软件、硬件或系统,以揭示其工作原理,而不依赖于原始设计信息。在IT领域,逆向工程被广泛应用于安全研究、软件调试、代码优化、漏洞发现、兼容性问题解决...

    c++ 的array源码分析和reverse-iterator和-Array-const-iterator类

    c++ 的array源码分析和reverse-iterator和-Array-const-iterator类

    dwr3ReverseAjax示例

    1. **DWR配置**:首先需要在服务器端配置DWR的`dwr.xml`文件,声明可供JavaScript调用的Java类和方法。这包括设置安全策略、白名单等,确保只有预期的Java对象和方法可以被访问。 2. **Java后端**:创建一个Java类...

    iOS App Reverse Engineering

    iOS App ReverseEngineering

    CTF逆向(reverse)入门脑图

    CTF逆向(reverse)入门脑图,xmind格式文件。Reverse即逆向工程,题目涉及到软件逆向、破解技术等,要求有较强的反汇编、反编译扎实...主要考查参赛选手的逆向分析能力。 仅供CTF竞赛参考使用,请不要做违法乱纪的事情

    ISCC2015 Writeup REVERSE - Q7.docx

    本文档总结了 ISCC2015 Writeup REVERSE - Q7.docx 中的逆向工程挑战题目,涉及到多种逆向工程技术和算法,包括 DLL 文件分析、APK 文件修复、DES 解密、AES 解密、DEX 文件解密等。 0x01 RE01 (200pt) heeeeeeeelp...

    android reverse tethering2.3

    电脑没有无线网卡,家里没有无线路由器,公司没有wifi网络时却又想让手机不耗流量上网,畅玩手机网游怎么办... Ps:若长时间无法检测到设备ID,请断开电脑上的手机助手类软件与手机的连接,并尝试重新拔插USB线!6 p- k

Global site tag (gtag.js) - Google Analytics