1

我们必须为外部接口实现加密。接口的所有者提供了有关如何在我们这边执行相同加密的文档。但是,此文档使用 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?

4

5 回答 5

10

您正在将 a 转换charint. Achar是一个 UTF-16 代码单元 - 一个无符号的 16 位整数(范围是[0, 65535])。你得到的值,基本上,扩大到一个 32 位有符号整数。'A'例如,以 65 结尾,欧元符号 (U+20AC) 以 8364 (0x20ac) 结尾。

至于您的第二部分-您正在创建一个int,您正在创建一个int 数组。是的,您将创建一个包含 320 个元素的数组。

于 2012-06-19T13:41:34.573 回答
1

C# 字符串是 UTF16。当您将 UTF16 字符转换为 int 时,它只是将 16 位 UTF16 字符值复制到 32 位 int 中。

于 2012-06-19T13:42:02.807 回答
1

C# 可以将字符转换为 int 并为您提供字符代码。上面的代码将字符串 ,hashString转换为整数数组keybuffer. []C# 能够使用索引器语法将字符串视为字符数组。上面的代码将产生一个整数数组,哈希字符串中每个字符一个,每个整数都是对应字符的字符代码。

于 2012-06-19T13:47:00.980 回答
1

为了扩展 Jon Skeet 的帖子,您的“十进制”数值将映射到对应的char值,如下图所示(我在开发 PC 上使用了多年)。

因此,将integer值 0 转换为 achar将返回 a NULL

ASCII 表

编辑:查看您的原始问题,您可能会更好地查看MD5 示例,而不是将字符串转换为整数数组。

于 2012-06-19T13:47:09.917 回答
1

代码实际上将char(通常是 ASCII)转换为int0,而不是 '0'。因此,如果原始字符串是“d131dd02c5e6eec4”,则结果数组将为 int[]{100, 49, 51, 49, 100, 100, 48、50、99、53、101、54、101、101、99、52}。

所以我想你需要ordPHP 脚本中的函数。

编辑:

稍微说明一下,在 PHP 中将 astring转换为int实际上可能会将其转换为int,并且最大的intPHP 句柄是 32 位或 64 位,具体取决于操作系统,这就是为什么你会得到一个 19 字符长的 int,这是最大值64 位整数。

在 C# 中,还有另一种变量类型叫做char,它表示一个 unicode 字符,并且可以直接转换为整数。您不能将stringC# 中的 aint直接转换为 C# 中的 a。

EDIT2: 我想你的 PHP 脚本看起来像这样:

<?php
$keyBuffer = new array();
for ($i=0; $i<strlen($hashString); $i++) {
    $keyBuffer[$i] = ord($hashString[i]);
}
?>
于 2012-06-19T13:48:44.347 回答