它接缝令人困惑,但我会尽力解释它!
我正在尝试在我的 C# 代码上运行 C++ DLL。
在这个 DLL 上,我有一个方法应该返回 20 个字符的 unsigned char*。代表 4 个字节的 5 个“字”。(sha-1 算法的输出)
我在我的 C# 项目中使用 DLLIMPORT,如下所示:
[DllImport("hashLibrary.dll", CharSet = CharSet.Ansi)]
static private extern string CallReturnString(IntPtr pHashClassObject);
这应该返回 5 WORDS 字符串。
这是我应该放弃字符串的 C++ 方法:
unsigned char* SHA1::Result(/*unsigned *message_digest_array*/)
{
int i; // Counter
int j = 0;
static int s_chString[5];
static unsigned char s_out[20]; // 4 * 5 + 10 de bob
if (Corrupted)
{
return false;
}
if (!Computed)
{
PadMessage();
Computed = true;
}
unsigned int a = 0;
a = H[0];
s_out[0] = (a >> (8*0)) & 0xff;
a = H[0];
s_out[1] = (a >> (8*1)) & 0xff;
a = H[0];
s_out[2] = (a >> (8*2)) & 0xff;
a = H[0];
s_out[3] = (a >> (8*3)) & 0xff;
a = H[1];
s_out[4] = (a >> (8*0)) & 0xff;
s_out[5] = (a >> (8*1)) & 0xff;
s_out[6] = (a >> (8*2)) & 0xff;
s_out[7] = (a >> (8*3)) & 0xff;
a = H[2];
s_out[8] = (a >> (8*0)) & 0xff;
s_out[9] = (a >> (8*1)) & 0xff;
s_out[10] = (a >> (8*2)) & 0xff;
s_out[11] = (a >> (8*3)) & 0xff;
a = H[3];
s_out[12] = (a >> (8*0)) & 0xff;
s_out[13] = (a >> (8*1)) & 0xff;
s_out[14] = (a >> (8*2)) & 0xff;
s_out[15] = (a >> (8*3)) & 0xff;
a = H[4];
s_out[16] = (a >> (8*0)) & 0xff;
s_out[17] = (a >> (8*1)) & 0xff;
s_out[18] = (a >> (8*2)) & 0xff;
s_out[19] = (a >> (8*3)) & 0xff;
s_out[20] = '\0';
return s_out;
}
在这段代码中,我尝试从 H 获取所有字节并放入一个将传递给 C# 代码的字符。
H 声明是: unsigned H[5];
它几乎可以工作,但由于某种原因,某些组合给了我疯狂的结果,比如 C# 上的 22 个成员字符串,并且值都错误。
我认为这与 C# 和 C++ 上的一些不同类型的变量有关。如果我只能从 char* 中获取所有字节,就像它们在 C++ 代码中一样,那就太棒了。
有谁知道该怎么做?
非常感谢你们!
编辑 :
一般的工作流程是:
- 我的 Windows 窗体应用程序从 C++ 类创建一个新类:
HashWrapper hash = new HashWrapper();
- 我的 windows 窗体应用程序将种子发送到 C++(这是一个 SHA-1 算法类):
hash.SendInput("abc");
- 我的 windows 窗体应用程序要求 c++ 算法的结果:
string output = hash.ReturnString();
在这里,我将把我调用的方法放在最上面:
public HashWrapper()
{
// We have to Create an instance of this class through an exported function
this.m_pNativeObject = CreateSHA1Class();
}
public void SendInput(string inp )
{
CallInput(this.m_pNativeObject, inp, inp.Length);
}
public string ReturnString()
{
string ans = CallReturnString(this.m_pNativeObject);
return ConvertStringToHex(ans); // Converts to Hex
}
public string ConvertStringToHex(string asciiString)
{
string hex = "";
foreach (char c in asciiString)
{
int tmp = c;
hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString()));
}
return hex;
}