以下代码亲测有效。用于QQ互联开发中,将QQ的openId转换成长整数型数据(十进制);
js版本:
function GetCrc32(Instr) {
if (typeof window.Crc32Table != "undefined") return;
window.Crc32Table = new Array(256);
var i, j;
var Crc;
for (i = 0; i < 256; i++) {
Crc = i;
for (j = 0; j < 8; j++) {
if (Crc & 1) Crc = Crc >> 1 & 2147483647 ^ 3988292384; else Crc = Crc >> 1 & 2147483647;
}
Crc32Table[i] = Crc;
}
if (typeof Instr != "string") Instr = "" + Instr;
Crc = 4294967295;
for (i = 0; i < Instr.length; i++) Crc = Crc >> 8 & 16777215 ^ Crc32Table[Crc & 255 ^ Instr.charCodeAt(i)];
Crc ^= 4294967295;
return Crc;
};
易语言版本:
.版本 2
.DLL命令 RtlComputeCrc32, 整数型, "ntdll.dll", , 公开, 计算一个字节块的CRC32校验和
.参数 dwInitial, 整数型, , Initial CRC value,0,码表
.参数 pData, 文本型, , Data block
.参数 iLen, 整数型, , Length of the byte block,文本长度
.版本 2
.子程序 进制_十六到十, 长整数型, 公开, 将16进制文件转换到10进制数值(返回十进制数)
.参数 文本, 文本型
.局部变量 i, 整数型
.局部变量 t, 文本型
.局部变量 结果, 长整数型
.局部变量 局_文本, 文本型
t = “0123456789ABCDEF”
局_文本 = 到大写 (文本)
.计次循环首 (取文本长度 (文本), i)
结果 = 结果 × 16 + 寻找文本 (t, 取文本中间 (局_文本, i, 1), , 假) - 1
.计次循环尾 ()
返回 (结果)
易语言调用方法:
.版本 2
.局部变量 qqId, 长整数型, , , openId转换的crc32数据
qqId = 进制_十六到十 (取十六进制文本 (RtlComputeCrc32 (0, openId, 取文本长度 (openId))))