将字母强制转换为int时,C#做了什么?

时间:2012-06-19 13:39:24

标签: c# php casting

我们要为外部接口实现加密。接口的所有者已经提供了如何在我们这边预先形成相同加密的文档。但是,此文档在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?

5 个答案:

答案 0 :(得分:10)

您正在将char转换为intchar是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

ASCII Table

编辑:查看原始问题,您可以更好地查看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}}