我有一个将字节数组转换为整数
的方法public int Encode(string input)
{
var bytes = Encoding.Unicode.GetBytes(input.ToLowerInvariant());
return BitConverter.ToInt64(bytes,0);
}
为什么这个整数对于任何输入字符串都没有区别?
例如
input = "http://www.google.com => 31525695615402088
和
input = "http://www.microsoft.com => 31525695615402088
答案 0 :(得分:6)
因为64位是8个字节,所以ToInt64
仅消耗输入数组的前8个字节。您使用的字符串的前八个字节是什么?
而且,正如alexm所说,Encoding.Unicode
指定UTF-16,其中每个字符实际上是两个字节(usually),因此只有前4个字符计数。
答案 1 :(得分:3)
'h' == 0x68
't' == 0x74
'p' == 0x70
小端,双字节字符,所以" http"为您提供一个以:
开头的数组{ 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00 ...
将其解释为小端32位整数,然后得到:
0x0070007400740068
其中,当然等于31525695615402088
答案 2 :(得分:2)
int64是8个字节。我相信你可以从那里弄明白。
答案 3 :(得分:2)
这是因为64位整数使用8字节的内存,而BitConverter只会使用您指定的字节数组的前8个字节进行转换,从位置0开始。您提供的每个样本输入都以相同的8开始字节。
对于它的价值,不可能将一个可变长度字符串的无损编码转换为大小为4-8字节的整数数据类型。您可能正在寻找一个哈希算法,它以有限的字节数表示您的数据。
答案 4 :(得分:0)
好吧,ToInt64使用8个字节 - 即4个unicode字符。
答案 5 :(得分:0)
因为BitConverter.ToInt64
只占用字节数组的前8个字节,这些字节对于字符串是相同的。尝试输入字符串“google.com”和“yahoo.com”。