我们要为外部接口实现加密。接口的所有者已经提供了如何在我们这边预先形成相同加密的文档。但是,此文档在C#中,我们使用PHP。
我们理解的大多数部分除了它们似乎将一个哈希类型转换为int。他们的代码是:
// hashString exists and is a md5 a like string
int[] keyBuffer = new int[hashString.length];
for (int i=0; i<hashString.length; i++) {
keyBuffer[i] = (int)hashString[i];
}
在PHP中,将字母转换为int时,得到0(int)。由于我们无法想象这是第三方意味着什么,我们相信C#会做其他事情。
C#是否也会转换为int 0,或者可能转换为char?
其次,原始的hashString长320。这意味着代码将创建一个320长的int?在PHP中,你没有像C#那样保留内存的想法。但是当我们尝试将320长字符串强制转换为int时,我们得到一个长度为19'字符的int。
在字符串中对一个非常长的“数字”进行类型转换时,C#是否也会创建一个较短的int?
答案 0 :(得分:10)
您正在将char
转换为int
。 char
是UTF-16代码单元 - 无符号16位整数(范围为[0, 65535]
)。你得到的值基本上扩展为32位有符号整数。因此,'A'
最终为65,欧元符号(U + 20AC)最终为8364(0x20ac)。
至于你的第二部分 - 你正在创建一个int
,你正在创建一个int
数组。是的,你将创建一个包含320个元素的数组。
答案 1 :(得分:1)
C#字符串是UTF16。将UTF16字符转换为int时,它只是将16位UTF16字符值复制到32位int中。
答案 2 :(得分:1)
C#可以将一个字符强制转换为int,并为您提供字符代码。上面的代码采用字符串hashString
,并将其转换为整数数组keybuffer
。 C#能够使用索引器[]
语法处理字符串数组之类的字符串。上面的代码将生成一个int数组,哈希字符串中每个字符一个,每个int将是相应字符的字符代码。
答案 3 :(得分:1)
要扩展Jon Skeet的帖子,您的“十进制”整数值将映射到相应的 char 值,如下图所示(我在开发时已经使用过) PC多年来。)
因此,将integer
值0转换为char
将返回NULL
。
编辑:查看原始问题,您可以更好地查看MD5 Example,而不是将字符串转换为整数数组。
答案 4 :(得分:1)
代码实际上将char
(通常是ASCII)转换为int
,而不是'0'转换为0.因此,如果原始字符串是“d131dd02c5e6eec4”,则生成的数组将为int [] {100,49,51,49,100,100,48,50,99,53,101,54,101,101,99,52}。
所以我想你在PHP脚本中需要函数ord
。
修改强>
有点评论,在PHP中将string
转换为int
实际上可以将其标记为int
,并且最大的int
PHP句柄是32位或64位-bit取决于操作系统,这就是为什么你得到一个19-char long int,这是64位int的最大值。
在C#中,还有另一个名为char
的变量类型,它代表一个unicode字符,可以直接转换为整数。您无法直接在C#中将string
C#中的int
转换为<?php
$keyBuffer = new array();
for ($i=0; $i<strlen($hashString); $i++) {
$keyBuffer[$i] = ord($hashString[i]);
}
?>
。
<强> EDIT2:强> 我想你的PHP脚本看起来像这样:
{{1}}