当前位置: 首页 > 编程日记 > 正文

Oracle wrap 和 unwrap( 加密与解密) 说明

一. Wrap 说明

官网的说明如下:

A PL/SQL Source Text Wrapping

http://download.oracle.com/docs/cd/E11882_01/appdev.112/e17126/wrap.htm#LNPLS1744

You can wrap the PL/SQL source text for any of these stored PL/SQL units, thereby preventing anyone from displaying or editing that text:

(1)Package specification

(2)Package body

(3)Type specification

(4)Type body

(5)Function

(6)Procedure

A file containing wrapped PL/SQL source text is called a wrapped file. Awrapped file can be moved, backed up, or processed by SQL*Plus or the Importand Export utilities.

To produce a wrapped file, use either the PL/SQL Wrapper utility or a DBMS_DDL subprogram.The PL/SQL Wrapper utility wraps the source text of every wrappable PL/SQL unitcreated by a specified SQL file. The DBMS_DDL subprograms wrap thesource text of single dynamically generated wrappable PL/SQL units.

Both the PL/SQL Wrapper utility and DBMS_DDL subprograms detecttokenization errors (for example, runaway strings), but not syntax or semanticerrors (for example, nonexistent tables or views).

Wrapped files are upward-compatible between Oracle Database releases. For example, youcan load files produced by the V8.1.5 PL/SQL Wrapper utility into a V8.1.6 OracleDatabase.

itpub上有篇文章提到了wrap 加密的原理:

From:http://space.itpub.net/12932950/viewspace-619808

  Oracle加密的原理就是先对源码进行lz压缩lzstr,然后对压缩数据进行SHA-1运算得到40位的加密串shstr,然后将加密串与压缩串拼接得到shstr+lzstr,然后对拼接后的字符串进行Oracle双字符转换(转换表)。最后将转换后的字符串进行base64编码,最终得到wrap的加密串。

    The default file extension for input_file is sql. The default nameof output_file is input_file.plb. Therefore, these commands are equivalent:

wrapiname=/mydir/myfile

wrapiname=/mydir/myfile.sql oname=/mydir/myfile.plb

Thisexample specifies a different file extension for input_file and adifferent name for output_file:

wrapiname=/mydir/myfile.src oname=/yourdir/yourfile.out

wrap 的使用步骤如下:

(1)将我们要加密的sql 语句保存到一个sql文本里。

(2)用wrap 进行处理,指定输入的sql,即我们第一步的问题,然后指定输出的路径和文件名,默认扩展名是plb。

(3)执行我们第二部进过wrap 处理的sql,即plb文件,创建我们的对象.

示例1:wrap funcation

--函数

CREATE OR REPLACE FUNCTION F_DAVE (

n int

) RETURN string

IS

BEGIN

IF n = 1 THEN

RETURN 'Dave is DBA!';

ELSIF n = 2 THEN

RETURN 'Dave come from AnQing!';

ELSE

RETURN 'Dave come from HuaiNing!';

END IF;

END;

/

SYS@dave2(db2)> select F_DAVE(4) fromdual;

F_DAVE(4)

--------------------------------------------------------------------------------

Dave come from HuaiNing!

BTW: 今天群里有人问我的blog的例子里为啥有安庆,因为我是安庆怀宁人。

[oracle@db2 ~]$ pwd

/home/oracle

[oracle@db2 ~]$ cat dave.sql

CREATE OR REPLACE FUNCTION F_DAVE (

n int

) RETURNstring

IS

BEGIN

IF n = 1 THEN

RETURN 'Dave is DBA!';

ELSIF n = 2 THEN

RETURN 'Dave come from AnQing!';

ELSE

RETURN 'Dave come from HuaiNing!';

END IF;

END;

/

[oracle@db2 ~]$ wrap iname=dave.sql

PL/SQL Wrapper: Release 10.2.0.1.0-Production on Thu Aug 18 22:59:14 2011

Copyright (c) 1993, 2004, Oracle.  All rights reserved.

Processing dave.sql to dave.plb

[oracle@db2 ~]$ ls

bifile.bbd dave.plb  dave.sql  Desktop log.bbd

[oracle@db2 ~]$ cat dave.plb

CREATE OR REPLACE FUNCTION F_DAVE wrapped

a000000

1

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

8

10d e7

S9NWrpt8q6tkKEMxCcfYJz2aLF4wgxDQLZ4VfC9AkE6OnV4ydypXGhveHcDg8UXy98WIg6xR

crtc/BRdQJjutbna/9+g0LlaSx87/znV+y926S1AeC0IRi/tjPJTyvJereDdk8mftMo8QMjV

fw0xXn0zVagAawwNVhSAiy/JPTMKkrBkC5ruMwQSTe6JQNq7Q2QtJV0hgQou0rYuet4/gJ5B

wAj75ph6EA==

/

SYS@dave2(db2)> @dave.plb

--再次调用函数,正常使用:

SYS@dave2(db2)> select F_DAVE(4) fromdual;

F_DAVE(4)

--------------------------------------------------------------------------------

Dave come from HuaiNing!

--查看函数源码,已经加过密了:

SYS@dave2(db2)> select text fromdba_source where name='F_DAVE';

TEXT

--------------------------------------------------------------------------------

FUNCTION F_DAVE wrapped

a000000

1

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

TEXT

--------------------------------------------------------------------------------

abcd

abcd

abcd

abcd

abcd

abcd

abcd

8

10d e7

S9NWrpt8q6tkKEMxCcfYJz2aLF4wgxDQLZ4VfC9AkE6OnV4ydypXGhveHcDg8UXy98WIg6xR

crtc/BRdQJjutbna/9+g0LlaSx87/znV+y926S1AeC0IRi/tjPJTyvJereDdk8mftMo8QMjV

TEXT

--------------------------------------------------------------------------------

fw0xXn0zVagAawwNVhSAiy/JPTMKkrBkC5ruMwQSTe6JQNq7Q2QtJV0hgQou0rYuet4/gJ5B

wAj75ph6EA==

示例2:SYS.DBMS_DDL 函数

the dbms_ddl package provides wrap functionsand create_wrapped procedures, each of whichwraps the pl/sql source text of a single dynamically generated wrappable pl/sqlunit.

The DBMS_DDL packagealso provides the exception MALFORMED_WRAP_INPUT (ORA-24230),which is raised if the input to WRAP or CREATE_WRAPPED isnot a valid wrappable PL/SQL unit. (For the list of wrappable PL/SQL units, seethe introduction to "PL/SQLSource Text Wrapping".)

Each WRAP functiontakes as input a single CREATE statement that creates a wrappablePL/SQL unit and returns an equivalent CREATE statement in which thePL/SQL source text is wrapped. For more information about the WRAP functions,see OracleDatabase PL/SQL Packages and Types Reference.

Each CREATE_WRAPPED proceduredoes what its corresponding WRAP function does and then runs thereturned CREATE statement, creating the specified PL/SQL unit. Formore information about the CREATE_WRAPPED procedures。

该示例直接参考官方文档:

DECLARE

package_text  VARCHAR2(32767); --text for creating package spec and body

FUNCTION generate_spec (pkgname VARCHAR2) RETURN VARCHAR2 AS

BEGIN

RETURN 'CREATE PACKAGE ' || pkgname || ' AUTHID DEFINER AS

PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER);

PROCEDURE fire_employee (emp_id NUMBER);

END ' || pkgname || ';';

ENDgenerate_spec;

FUNCTION generate_body (pkgname VARCHAR2) RETURN VARCHAR2 AS

BEGIN

RETURN'CREATE PACKAGE BODY ' || pkgname || ' AS

PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER) IS

BEGIN

UPDATE employees

SET salary = salary + amount WHERE employee_id = emp_id;

END raise_salary;

PROCEDURE fire_employee (emp_id NUMBER) IS

BEGIN

DELETE FROM employees WHERE employee_id = emp_id;

END fire_employee;

END ' || pkgname || ';';

ENDgenerate_body;

BEGIN

package_text := generate_spec('emp_actions');  -- Generate package spec

EXECUTE IMMEDIATE package_text;                -- Create package spec

package_text := generate_body('emp_actions');  -- Generate package body

  SYS.DBMS_DDL.CREATE_WRAPPED(package_text);     -- Create wrapped package body

END;

/

二. Unwrap 说明

    wrap的目的是为了加密,所以Oracle并没有提供unwrap 的方法。 itpub上的一些牛人研究了一下这个问题,写了一些unwrap的代码。 具体讨论的过程,参考itpub的2个帖子:

http://www.itpub.net/thread-1154232-1-2.html

http://www.itpub.net/viewthread.php?tid=1175718&extra=page%3D1&frombbs=1

我这里贴一下unwrap 的代码:

/* Formatted on2011/8/18 12:59:54 (QP5 v5.163.1008.3004) */

CREATE OR REPLACE PACKAGE amosunwrapper

IS

FUNCTION deflate (src IN VARCHAR2)

RETURN RAW;

FUNCTION deflate (src IN VARCHAR2, quality IN NUMBER)

RETURN RAW;

FUNCTION inflate (src IN RAW)

RETURN VARCHAR2;

END;

/

CREATE OR REPLACE PACKAGE BODY amosunwrapper

IS

FUNCTION deflate (src IN VARCHAR2)

RETURN RAW

IS

BEGIN

RETURN deflate (src, 6);

END;

FUNCTION deflate (src IN VARCHAR2, quality IN NUMBER)

RETURN RAW

AS

LANGUAGE JAVA

NAME 'UNWRAPPER.Deflate( java.lang.String, int ) returnbyte[]';

FUNCTION inflate (src IN RAW)

RETURN VARCHAR2

AS

LANGUAGE JAVA

NAME 'UNWRAPPER.Inflate( byte[] ) returnjava.lang.String';

END;

/

/* Formatted on2011/8/18 13:00:16 (QP5 v5.163.1008.3004) */

CREATE OR REPLACE JAVA SOURCE NAMED UNWRAPPER

AS import java.io.*;

import java.util.zip.*;

public class UNWRAPPER

{

public static String Inflate( byte[] src )

{

try

{

ByteArrayInputStream bis = new ByteArrayInputStream( src );

InflaterInputStream iis = newInflaterInputStream( bis );

StringBuffer sb = newStringBuffer();

for( int c = iis.read(); c != -1; c = iis.read() )

{

sb.append( (char) c );

}

return sb.toString();

} catch ( Exception e )

{

}

return null;

}

public static byte[] Deflate( String src, intquality )

{

try

{

byte[] tmp = newbyte[ src.length() + 100 ];

Deflater defl = new Deflater( quality );

defl.setInput( src.getBytes( "UTF-8" ) );

defl.finish();

int cnt = defl.deflate( tmp );

byte[] res = newbyte[ cnt ];

for( int i = 0; i < cnt; i++ )

res = tmp;

return res;

} catch ( Exception e )

{

}

return null;

}

}

/

ALTER JAVA SOURCE UNWRAPPER COMPILE

/

/* Formatted on2011/8/18 13:02:57 (QP5 v5.163.1008.3004) */

--为了输出中文,要修改java过程

CREATE OR REPLACE JAVA SOURCE NAMED UNWRAPPER

AS import java.io.*;

import java.util.zip.*;

public class UNWRAPPER

{

public static String Inflate( byte[] src )

{

try

{

ByteArrayInputStream bis = newByteArrayInputStream( src );

InflaterInputStream iis = newInflaterInputStream( bis );

StringBuffer sb = newStringBuffer();

for( int c = iis.read(); c != -1; c = iis.read() )

{

sb.append( (char) c );

}

String hello = new String(sb.toString().getBytes("iso8859-1"), "GBK");

return hello;

} catch ( Exception e )

{

}

return null;

}

public static byte[] Deflate( String src, intquality )

{

try

{

byte[] tmp = newbyte[ src.length() + 100 ];

Deflater defl = new Deflater( quality );

defl.setInput( src.getBytes( "UTF-8" ) );

defl.finish();

int cnt = defl.deflate( tmp );

byte[] res = newbyte[ cnt ];

for( int i = 0; i < cnt; i++ )

res = tmp;

return res;

} catch ( Exception e )

{

}

return null;

}

}

/

ALTER JAVA SOURCE UNWRAPPER COMPILE

/

/* Formatted on2011/8/18 13:00:41 (QP5 v5.163.1008.3004) */

CREATE OR REPLACE PROCEDURE unwrap (o IN VARCHAR, n IN VARCHAR, t IN VARCHAR)

AS

vWrappedtext    VARCHAR2 (32767);

vtrimtext       VARCHAR2 (32767);

vChar           VARCHAR2 (2);

vRepchar        VARCHAR2 (2);

vLZinflatestr   VARCHAR2 (32767);

nLen            INTEGER;

nLoop           INTEGER;

nCnt            INTEGER;

code            VARCHAR (512);

BEGIN

code :=

'3D6585B318DBE287F152AB634BB5A05F7D687B9B24C228678ADEA4261E03EB176F343E7A3FD2A96A0FE935561FB14D1078D975F6BC4104816106F9ADD6D5297E869E79E505BA84CC6E278EB05DA8F39FD0A271B858DD2C38994C480755E4538C46B62DA5AF322240DC50C3A1258B9C16605CCFFD0C981CD4376D3C3A30E86C3147F533DA43C8E35E1994ECE6A39514E09D64FA5915C52FCABB0BDFF297BF0A76B449445A1DF0009621807F1A82394FC1A7D70DD1D8FF139370EE5BEFBE09B97772E7B254B72AC7739066200E51EDF87C8F2EF412C62B83CDACCB3BC44EC069366202AE88FCAA4208A64557D39ABDE1238D924A1189746B91FBFEC901EA1BF7CE'; --sys.idltranslate表内容存到字符数组

vtrimtext := '';

SELECT COUNT (*)

INTO ncnt

FROM DBA_SOURCE

WHERE owner = o AND Name = n AND TYPE = t;

IF ncnt > 0 AND ncnt <= 5

THEN

FOR i IN 1 .. ncnt

LOOP

IF i = 1

THEN

SELECT RTRIM (SUBSTR (TEXT,

INSTR (TEXT,

CHR (10),

1,

20)

+ 1),

CHR (10))                      --保存去掉前边20行的BASE64码正文

INTO vLZinflatestr

FROM DBA_SOURCE

WHERE owner = o AND Name = n AND TYPE = t AND line = i;

ELSE

SELECT text

INTO vLZinflatestr

FROM DBA_SOURCE

WHERE owner = o AND Name = n AND TYPE = t AND line = i;

END IF;

vtrimtext := vtrimtext || vLZinflatestr;

END LOOP;

END IF;

vtrimtext := REPLACE (vtrimtext, CHR (10), '');

nLen := LENGTH (vtrimtext) / 256;

vWrappedtext := '';

FOR i IN 0 .. nLen

LOOP

--ifi< nLen   then

vWrappedtext :=

vWrappedtext

|| UTL_ENCODE.base64_decode (

UTL_RAW.cast_to_raw (SUBSTRB (vtrimtext, 256 * i + 1, 256)));

--else

--vWrappedtext:=vWrappedtext||utl_encode.base64_decode(utl_raw.cast_to_raw(substrb(vtrimtext,64*i+1 ))) ;

--endif;

--DBMS_OUTPUT.PUT_LINE(vWrappedtext);

END LOOP;

--vWrappedtext:=substr(vWrappedtext,41);

nLen := LENGTH (vWrappedtext) / 2 - 1;

vLZinflatestr := '';

FOR nLoop IN 20 .. nLen

LOOP                                                            --从第41字节开始

vChar := SUBSTRB (vWrappedtext, nLoop * 2 + 1, 2);

vLZinflatestr :=

vLZinflatestr || SUBSTR (code, TO_NUMBER (vChar, 'XX') * 2 + 1, 2); --从字符串变量匹配

--DBMS_OUTPUT.PUT_LINE(vLZinflatestr);

END LOOP;

--DBMS_OUTPUT.PUT_LINE(vLZinflatestr);

DBMS_OUTPUT.PUT_LINE (amosunwrapper.inflate (vLZinflatestr));

END;

/

黄炜弄了一个界面的Unwrap软件,下载地址:

破解(Unwrap) 10, 11G PLSQL

http://www.hellodba.com/reader.php?ID=36&lang=cn

unwrap 我们第一节创建的F_DAVE函数:

不过Oracle 对一些对象进行加密的同时,也提供了代码,比如DBMS_ROWID包。 对于该包使用unwrap 和 直接从dba_source 查询的结果是一致的,而且dba_source 还提供了注释。

SQL>exec unwrap('SYS','DBMS_ROWID','PACKAGE BODY');

SQL>select * from dba_source where name='DBMS_ROWID';

-------------------------------------------------------------------------------------------------------

Blog: http://blog.csdn.net/tianlesoftware

Weibo: http://weibo.com/tianlesoftware

Email: dvd.dba@gmail.com

DBA1 群:62697716(满);   DBA2 群:62697977(满)  DBA3 群:62697850(满)

DBA 超级群:63306533(满);  DBA4 群: 83829929(满) DBA5群: 142216823(满)

DBA6 群:158654907(满)  聊天 群:40132017(满)   聊天2群:69087192(满)

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

转载于:https://www.cnblogs.com/tianlesoftware/archive/2011/08/18/3609597.html

相关文章:

python的沙盒环境virtualenv(二)--简单使用

安装 sudo apt-get install python-virtualenv使用方法 virtualenv [虚拟环境名称] 如&#xff0c;创建**ENV**的虚拟环境 virtualenv ENV默认情况下&#xff0c;虚拟环境会依赖系统环境中的site packages&#xff0c;就是说系统中已经安装好的第三方package也会安装在虚拟环境…

使用Powershell批量为Azure资源添加Tags

在使用Azure的过程中&#xff0c;我们可以将Tags应用于Azure资源&#xff0c;从而可以将元数据逻辑的组织到某些分类中。每个Tags由名称和值组成。例如&#xff0c;我们可以将名称“Environment”和值“Production”应用于生产中的所有资源。应用Tags以后&#xff0c;我们可以使…

4软件测试阶段

软件测试流程和规范前言软件测试阶段总结前言 不以规矩&#xff0c;不成方圆。 软件测试阶段 在软件测试中主要的测试阶段包括文档集测试、单元测试、集成测试、系统测试&#xff08;包括功能测试和非功能测试&#xff09;、安装测试、验收测试。 总结 不同的测试阶段有不同…

InfluxDB 2.0 Alpha展开测试!将会加入查询语言Flux

InfluxData释出其开源时序数据库InfluxDB 2.0 Alpha测试版&#xff0c;这个版本最大的更新&#xff0c;便是增加了新的数据脚本和查询语言Flux&#xff0c;不只能提供跨平台时序数据操作&#xff0c;还能将TICK组件堆栈整合成一个更加一致的平台。InfluxDB是一个以Go语言开发的…

Weka 开发[1]-Instances类

先google一下&#xff0c;把Weka软件下载下来&#xff0c;安装完成之后&#xff0c;在Weka的安装目录中有一个weka.jar的包。 把包添加到工程中后&#xff0c;就可以调用weka中的函数了。 再介绍一点weka的基本知识&#xff0c;在weka的目录下&#xff0c;有一个data的文件夹&a…

SQL Server 2005 18452登录错误 的解决方法

无法连接到服务器 服务器&#xff1a;消息18452&#xff0c; 级别16&#xff0c;状态1 [Microsoft][ODBC SQL Server Driver][SQL Server]用户‘sa’登陆失败。原因&#xff1a;未与信任SQL Server连接相关联 该错误发生的原因是由于SQL Ser…

5软件开发与软件测试

软件开发与软件测试 前言瀑布模型V模型总结前言 软件测试与软件开发过程是相辅相成、相互依赖、相互转换的过程。 瀑布模型 瀑布模型规定了软件生命周期中的各项活动,包括需求分析、概要设计、编码、测试、验收与交付、使用与维护等。瀑布模型中各个软件过程是自上而下、相互…

认识docker

一、Docker工作原理 二、Docker容器和虚拟机对比 三、镜像容器管理 1、Docker关键组件 2、Docker架构 3、Docker内部组件 镜像&#xff08;Image&#xff09;——一个特殊的文件系统 Docker 镜像是一个特殊的文件系统&#xff0c;除了提供容器运行时所需的程序、库、资源、配置…

Enterprise Library系列文章回顾与总结

Enterprise Library系列文章回顾与总结 自Enterprise Library 1.1 推出以来&#xff0c;Terry写了一系列的关于Enterprise Library的文章&#xff0c;其中得到了很多朋友的支持&#xff0c;在这里一并表示感谢。为了方便大家的阅读&#xff0c;这里我做了一下整理与分类。第Ⅰ部…

句法模式识别(两)-正规文法、上下文无关文法

正规的语法特点 1.全部长度有限的语言都是正规的。 2.用正规文法当然能产生无限长串&#xff0c;当中周期反复部分的长度不大于非终止符的长度。 举个样例 在此规则之下。能生成句子 当中周期反复部分为ab&#xff0c;这个样例的非终止符的元素个数为2&#xff0c;故满足2不大于…

6软件测试过程

软件测试过程前言软件测试的几个典型过程总结前言 测试策划、测试设计与实现、测试执行、回归测试和测试总结。 软件测试的几个典型过程 软件测试过程主要包括测试策划、测试设计与实现、测试执行、回归测试和测试总结&#xff0c;每个活动过程中包括的主要工作内容如下图所示…

BFS之三(单向bfs和康托压缩)

//poj 1077 Eight#include <iostream> //单向bfs和康托压缩#include<string>using namespace std;bool visited[1000000];int fac[]{1,1,2,6,24,120,720,5040,40320,362880}; //9!表int cantor(int arr[]) {int temp,num1; //当排列为…

[JavaWeb基础] 007.Struts2的配置和简单使用

1.框架简介 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架&#xff0c;用于快速开发Java Web应用。Struts实现的重点在C(Controller)&#xff0c;包括ActionServlet/RequestProcessor和我们定制的Action,也为V(View)提供了一系列定制标签&#xff08;C…

使用Rust + Electron开发跨平台桌面应用 ( 一 )

前言 近段时间学习了Rust&#xff0c;一直想着做点什么东西深入学习&#xff0c;因为是刚学习&#xff0c;很多地方都不熟悉&#xff0c;所以也就不能拿它来做编译器这些&#xff0c;至于web开发&#xff0c;实际上我并不建议拿这个来学习一门语言&#xff0c;大概有几个方面&a…

7软件质量与测试规范

软件质量与测试规范 前言标准/规范产品质量模型总结前言 标准和规范可以指导测试工作的方向。 标准/规范 软件质量与测试标准分为国际标准、国家标准、行业标准、企业(机构)规范、项目规范等。下一层标准需要在上一层标准的框架下做扩展或补充。比如行业标准首先要满足国家…

UVa 679 - Dropping Balls

称号&#xff1a;有一个完整的二叉树&#xff0c;每个节点是一个开关&#xff0c;最初的全封闭&#xff0c;球从顶点丢弃。 每次通过开关球将将其状态反转。现在先问k球落到d当层交换机经过号。分析&#xff1a;进制编码。经过模拟几次能够看出&#xff0c;球会让开关形成连续二…

【原创】StreamInsight查询系列(六)——基本查询操作之分组聚合

上篇博文介绍了StreamInsight基础查询操作中的用户自定义聚合部分。这篇文章将主要介绍如何在StreamInsight查询中使用分组聚合。 测试数据准备 为了方便测试查询&#xff0c;我们首先准备一个静态的测试数据源&#xff1a;var weatherData new[] {new { Timestamp new DateT…

生态环境部:提升5.5亿居民饮用水环境安全保障水平

资料图&#xff1a;备用水源。于从文 摄 中新网1月30日电 据生态环境部网站消息&#xff0c;生态环境部牵头扎实推进饮用水水源地环境保护专项行动&#xff0c;成效显著。截至2018年12月31日&#xff0c;除9个问题因冬季施工难度大或实际工程量大等因素仍在整治外&#xff0c;…

8单元测试的必要性

单元测试的必要性 前言单元测试堪比汽车零件检测总结前言 积土成山,风雨兴焉。 单元测试堪比汽车零件检测 据估计,一般轿车约由1万个不可拆解的独立零部件组装而成。结构极其复杂的特制汽车,,如F1赛车等,其独立零部件的数量可达到2万个之多。可以设想下,如果汽车组装企业…

朴素高精度乘法的常数优化

2015年辽宁省赛热身赛有一道高精度乘法 传送门&#xff1a;NEUOJ 1574 A*B 1574: A * B 时间限制: 10 Sec 内存限制: 128 MB题目描述 Calculate $a \times b$. 输入 Your program will be tested on one or more test cases. In each test case, two integer $a$, $b$ ($0\le …

计算机专业今后的发展方向

计算机专业毕业后&#xff0c;大致的工作方向是软、硬、网、图 四大类&#xff0c;尤其以软件、网络为现今的首选 。从岗位上分&#xff0c;又可以分为技术道路、营销道路两大方向。 if 你选择硬件技术&#xff0c;then 从现在开始&#xff0c;牢记&#xff1a;天道酬勤&#x…

新警达尼亚尔·迪力木拉提的春运一天

新春佳节临近&#xff0c;乌鲁木齐铁路公安处民警坚守一线&#xff0c;保障旅客安全乘车。达尼亚尔迪力木拉提&#xff0c;今年26岁&#xff0c;新疆伊犁州伊宁市人&#xff0c;毕业于大连理工大学。2017年通过国家公务员考试入警为乌鲁木齐铁路公安局乌鲁木齐公安处见习民警&a…

9 单元测试中不得不知的概念

单元测试中不得不知的概念 前言软件单元及单元测试驱动函数和桩函数总结前言 做单元测试,如果不弄清楚什么是单元,那十八般武器也无的放矢了。可能在单元测试中听到最多的就是驱动函数、桩函数和逻辑覆盖,本专题就讲讲关于单元测试中那些不得不知的概念。关于逻辑覆盖,涉及…

php JSON数据格式化输出方法

php 的json_encode能把数组转换为json格式的字符串。字符串没有缩进&#xff0c;中文会转为unicode编码&#xff0c;例如\u975a\u4ed4。人阅读比较困难。现在这个方法在json_encode的基础上再进行一次美化处理。使人能方便阅读内容。 1. 使用 json_encode 输出 1 <?php2 3 …

转:C#中的abstract与virtual

C#中的abstract与virtual2008-03-14 14:01【abstract】 abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用 abstract 修饰符以指示类只能是其他类的基类。 抽象类具有以下特性&#xff1a; 抽象类不能实例化。 抽象类可以包含抽象方法和抽象访问器。…

从零开始单排学设计模式「UML类图」定级赛

阅读本文大概需要 3.5 分钟。本篇是设计模式系列的开篇&#xff0c;虽然之前也写过相应的文章&#xff0c;但是因为种种原因后来断掉了&#xff0c;而且发现之前写的内容也很渣&#xff0c;不够系统。所以现在打算重写&#xff0c;加上距离现在也有一段时间了&#xff0c;也算是…

10 单元测试使命

单元测试的使命前言单元测试要完成的内容总结前言 不同级别的测试的侧重点是不同的&#xff0c;单元测试也有它的使命所在。 单元测试要完成的内容 单元测试的重点主要包括验证功能的正确性、检查局部数据结构正确性、检查临界数据处理正确性、检查模块接口正确性和验证单元容…

MVVM test

示例代码 public class RegisterUserViewModel{public UserInfo userInfo { get; set; }public ICommand ClickCommand { get; set; }public RegisterUserViewModel(){userInfo new UserInfo();userInfo.Age 25;this.ClickCommand new DelegateCommand<object>(OnClic…

[SCOI2009]生日礼物

这道题很容易看出是一道单调队列题。 首先我们根据珠子的位置排序。 然后按顺序枚举一个个珠子。 如果该种珠子没有出现过标记上它的位置&#xff0c;如果出现过修改并打上当前位置。当所有珠子都出现后&#xff0c;将当前位置减去打标记位置最小的一个即为当前解。 可以证明正…

.Net(c#) 通过 Fortran 动态链接库,实现混合编程

c# 与 Fortran 混合编程解决方案主要有两种&#xff1a;1. 进程级的交互&#xff1a;在 Fortran 中编译为控制台程序&#xff0c;.Net 调用&#xff08;System.Diagnostics.Process&#xff09;&#xff0c;然后使用 Process 的 StandardOutput 属性读取控制台输出内容&#xf…