我正试图将一个用C#制作的CRC 32生成器的特定实现转换为静态网站的JavaScript.
它将两个字符串合并为一个,将其转换为一个,生成CRC,并将其转换为十六进制输出.
问题是,JavaScript版本(CF 2 F4221)的输出与C#版本(67 CDF980)不匹配.
C#代码:
using System;
using System.Text;
namespace CRC32.Generator
{
internal class CRC
{
public static readonly uint[] Table;
private uint _value = 0xFFFFFFFF;
static CRC()
{
Table = new uint[256];
const uint kPoly = 0xEDB88320;
for (uint i = 0; i < 256; i++)
{
uint r = i;
for (int j = 0; j < 8; j++)
if ((r & 1) != 0)
r = (r >> 1) ^ kPoly;
else
r >>= 1;
Table[i] = r;
}
}
public void Init()
{
_value = 0xFFFFFFFF;
}
public void UpdateByte(byte b)
{
_value = Table[(((byte) (_value)) ^ b)] ^ (_value >> 8);
}
public void Update(byte[] data, uint offset, uint size)
{
for (uint i = 0; i < size; i++)
_value = Table[(((byte) (_value)) ^ data[offset + i])] ^ (_value >> 8);
}
public uint GetDigest()
{
return _value ^ 0xFFFFFFFF;
}
}
class Program
{
static void Main(string[] args)
{
string string1 = "TestString1";
string string2 = "TestString2";
string stringData = string1 + string2;
byte[] data = Encoding.Unicode.GetBytes(stringData);
CRC crc = new CRC();
crc.Update(data, 0, (uint)data.Length);
uint crc32Value = crc.GetDigest();
byte[] bytes = BitConverter.GetBytes(crc32Value);
Array.Reverse(bytes);
uint reversedCrc32Value = BitConverter.ToUInt32(bytes, 0);
Console.WriteLine(reversedCrc32Value.ToString("X"));
}
}
}
JavaScript代码:
// CRC32 Table
const crc32Table = new Array(256);
for (let i = 0; i < 256; i++) {
let crc = i;
for (let j = 0; j < 8; j++) {
crc = (crc & 1) ? (crc >>> 1) ^ 0xEDB88320 : crc >>> 1;
}
crc32Table[i] = crc;
}
// CRC32 Function
function crc32(data) {
let crc = 0xFFFFFFFF;
for (let i = 0; i < data.length; i++) {
crc = (crc >>> 8) ^ crc32Table[(crc ^ data[i]) & 0xFF];
}
return (crc ^ 0xFFFFFFFF) >>> 0; // Unsigned right shift
}
// Generate CRC
function generateCRC() {
let string1 = document.getElementById('string1').value;
let string2 = document.getElementById('string2').value;
let stringData = string1 + string2;
// Convert the string to a UTF-16LE byte array
let encoder = new TextEncoder('utf-16le');
let data = encoder.encode(stringData);
let crc32Value = crc32(new Uint8Array(data.buffer));
document.getElementById('output').textContent = crc32Value.toString(16).toUpperCase(); // Convert to hexadecimal
}
从我所做的研究中,我了解到C#和JavaScript输出之间的差异很可能是由于这两种语言在处理逐位操作、字节顺序以及字符编码方面的差异所致.
我希望那些对这些事情有更多了解的人能给我指明正确的方向,因为无可否认这超出了我的理解范围.