将Flash转换为c#时出错
本文关键字:出错 Flash 转换 | 更新日期: 2023-09-27 18:06:21
我在Flash中有以下方法,它写入两个ByteArrays
,然后base64对它们进行编码
private function generateSignature(data:String, secretKey:String):String {
var secretKeyByteArray:ByteArray = new ByteArray();
secretKeyByteArray.writeUTFBytes(secretKey);
secretKeyByteArray.position = 0;
var dataByteArray:ByteArray = new ByteArray();
dataByteArray.writeUTFBytes(data);
dataByteArray.position = 0;
var hmac:HMAC = new HMAC(new SHA1());
var signatureByteArray:ByteArray = hmac.compute(secretKeyByteArray, dataByteArray);
return Base64.encodeByteArray(signatureByteArray);
}
在我的c#中,我有:
string GenerateSignature(string secretKey, string base64Policy)
{
byte[] secretBytes = Encoding.UTF8.GetBytes(secretKey);
byte[] dataBytes = Encoding.UTF8.GetBytes(base64Policy);
HMACSHA1 hmac = new HMACSHA1(secretBytes);
byte[] signature = hmac.ComputeHash(dataBytes);
return ByteToString(signature);
}
但是,与c#版本相比,我从Flash版本得到了不同的结果集。有人能发现明显错误的地方吗?
编辑下面是ByteToString
方法:
static string ByteToString(byte[] buffer)
{
string binary = string.Empty;
for (int i = 0; i < buffer.Length; i++)
{
binary += buffer[i].ToString("X2"); // Hex Format
}
return binary;
}
看起来差不多;也就是说,我建议使用Convert.ToBase64String
而不是您的ByteToString
方法,其中的字符串连接通常被认为是非常糟糕的做法。
我也不能100%确定Base 64编码是否在逻辑上与将每个字节的byte.ToString("X2")
附加到字符串相同(尽管它很可能是)。
除此之外,调试和找出两者开始偏离的地方应该不会太难…
ByteToString函数仅返回签名的十六进制版本。您的flash版本base64编码它。将一些东西转换成十六进制字符串和64进制编码之间有很大的区别。
使用Convert.ToBase64String
代替ByteToString
Flash可能不会发出BOM(字节顺序标记),而c# (. net)会。
public static readonly Encoding Utf8NoBom = new UTF8Encoding(false);
根据Flash文档,您正在c#端使用正确的编码;所以这是唯一可能的替代方案(它没有任何关于BOM的说明)。