以下Delphi例程最初来自很久以前的CompuServe发布,用于加密我们数据库中的各种信息.下面是Delphi 2007和(由于一些有关Unicode差异的SO帮助)Delphi XE版本.
我们一直试图将其转换为C#,并且已经接近了,但我们在某处遗漏了某些东西.不幸的是,我们的Delphi家伙(我)不知道C#,而C#家伙是Delphi的新手.C#没有(似乎)具有AnsiString的概念,因此解决方案可能涉及字节或字符数组?
我们非常感谢将此转换为C#的任何帮助.
Delphi 2007版(ASCII)
function EncodeDecode(Str: string): string;
const
Hash: string = '^%12hDVjED1~~#29afdmSD`6ZvUY@hbkDBC3fn7Y7euF|R7934093*7a-|- Q`';
var
I: Integer;
begin
for I := 1 to Length (Str) do
Str[I] := chr (ord (Str[I]) xor not (ord (Hash[I mod Length (Hash) + 1])));
Result := Str;
end;
Run Code Online (Sandbox Code Playgroud)
Delphi XE版本(Unicode)
function TfrmMain.EncodeDecode(Str: AnsiString): AnsiString;
const
Hash: string = '^%12hDVjED1~~#29afdmSD`6ZvUY@hbkDBC3fn7Y7euF|R7934093*7a-|- Q`';
var
I: Integer;
begin
Result := Str;
for I := 1 to Length (Result) do
Result[I] := AnsiChar (ord (Result[I]) xor …Run Code Online (Sandbox Code Playgroud) Delphi 2007,明年转向Delphi XE.
我们的产品广泛使用第三方组件.我们不直接使用该组件,而是使用它的自定义后代,我们已经添加了相当多的额外行为(自定义后代组件是几年前由已经退休的开发人员开发的).
在第三方Parent类的源单元中,声明了一些枚举类型,它们控制组件的各种操作:
TSpecialKind = (skAlpha, skBeta, skGamma);
TSpecialKinds = set of TSpecialKind;
Run Code Online (Sandbox Code Playgroud)
在我们的后代类中,我们想要添加新行为,这需要扩展枚举类型的选择.基本上,我们想要这个:
TSpecialKind = (skAlpha, skBeta, skGamma, skDelta, skEpsilon);
TSpecialKinds = set of TSpecialKind;
Run Code Online (Sandbox Code Playgroud)
显然,我们希望避免编辑第三方代码.简单地重新声明枚举类型,重复原始值并在我们自己的后代单元中添加新值是否有效?它会对现有代码产生任何影响吗?
编辑:示例场景(希望)澄清.假设您有一个(父)组件用于订购车辆零件.父单元具有用于车辆类型的枚举类型Tvkind,其值为vkCar和vkCycle.除其他外,这些值用于表示车辆有多少车轮,4或2.
现在,在您的后代组件中,您也希望能够处理三轮车辆.扩展Tvkind枚举类型以包含新值vkTrike似乎是一种显而易见的方法.但是,如果您无权访问或不想修改父组件代码,该怎么办?
我们有一个Delphi 2007例程用于加密表中的密码.该例程最初是在十年或更久以前从CompuServe帖子中获取的,并且存在大量使用此例程加密的数据.
原始例程的核心是:
chr(ord(Str[I]) xor not(ord(Id[I mod length(Id) + 1])));
Run Code Online (Sandbox Code Playgroud)
我知道由于Unicode的原因,转换为Delphi XE会有问题,因此我将该代码分解为一个函数,该函数在备忘录中显示计算的每个步骤:
function TfrmMain.EncodeDecode(AString: string): string;
const
Hash: string = '^%12h2DBC3f41~~#6093fn7mY7eujEhbFD3DZ|R9aSDVvUY@dk79*7a-|- Q';
var
I: Integer;
IMod: Integer;
HMod: Char;
OMod: Integer;
AStrI: Char;
OStrI: Integer;
ResultStr: string;
XOrNot: Integer;
ChrXN: AnsiChar;
begin
Memo1.Clear;
Memo1.Lines.Add ('AStrI' + TAB + 'IMod' + TAB + 'HMod' +
TAB + 'OMod' + TAB + 'OStrI' + TAB + 'XOrNot' + TAB + 'ChrXN');
for I := 1 to Length (AString) do
begin
IMod := …Run Code Online (Sandbox Code Playgroud) 在Visual Studio 2010,.NET v4中工作
我是C#和XML的新手.使用网站资源,我能够找到一种相当简单的方法来解析特定值的XML.然而,XML变得越来越复杂,我正在使用的方法(通过迭代导航技术)开始看起来相当荒谬,有许多嵌套的reader.Read()调用.我确信这种方式不那么令人尴尬,但是当你拥有的唯一工具就是锤子......
所以,问题是:什么是一个整洁,干净的方式来解析XML(见下文),只有从项目匹配返回所有"动作"值的列表,<item itemkind="Wanted">和<phrase>SomeSearchString</phrase>?
这是XML的一个片段:
<formats>
<items>
<item itemkind="NotWanted">
<phrase>Not this one</phrase>
<actions>
<action>
<actionkind>SetStyle</actionkind>
<parameter>Normal</parameter>
</action>
<action>
<actionkind>SetMargins</actionkind>
<parameter>0.25,0.25,1,4</parameter>
</action>
</actions>
</item>
<item itemkind="Wanted">
<phrase>SomeSearchString</phrase>
<actions>
<action>
<actionkind>Action 1</actionkind>
<parameter>Param 1</parameter>
</action>
<action>
<actionkind>Action 2</actionkind>
<parameter>Param 2</parameter>
</action>
<action>
<actionkind>Action 3</actionkind>
<parameter>Param 3</parameter>
</action>
</actions>
</item>
</items>
<styles>
<style stylename="Normal">
<fontname>Arial</fontname>
<fontsize>10</fontsize>
<bold>0</bold>
</style>
<style stylename="Heading">
<fontname>fntame frhead</fontname>
<fontsize>12</fontsize>
<bold>1</bold>
</style>
</styles>
</formats>
Run Code Online (Sandbox Code Playgroud)
这是我到达的代码.它确实有效,但是,好吧,看看你自己.请温柔:
public static List<TAction> GetActionsForPhraseItem(string AFileName, string APhrase)
{ …Run Code Online (Sandbox Code Playgroud)