Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试将Base64字符串作为字节传递_C# - Fatal编程技术网

C# 尝试将Base64字符串作为字节传递

C# 尝试将Base64字符串作为字节传递,c#,C#,请帮忙。我需要向Web服务传递3个值: RptDate(字符串) UserID(字符串) PassHash(base64Binary) 这个PassHash就是问题所在,因为PassHash应该是连接在一起的用户名和密码(UserIDPassword),然后计算这个值的二进制MD5哈希,然后将此散列值转换为Base64解码字符串。下面我的C#代码显示了到目前为止的示例 protected void btnSubmit_Click(object sender, EventArgs e) {

请帮忙。我需要向Web服务传递3个值:

  • RptDate(字符串)
  • UserID(字符串)
  • PassHash(base64Binary)
这个
PassHash
就是问题所在,因为PassHash应该是连接在一起的用户名和密码(
UserIDPassword
),然后计算这个值的二进制MD5哈希,然后将此散列值转换为Base64解码字符串。
下面我的C#代码显示了到目前为止的示例

protected void btnSubmit_Click(object sender, EventArgs e) {
    string UnameVal = "BSimpson";
    string PwordVal = "Springfield";
    string ReportDate = "2015-12-25";
    string source = string.Concat(UnameVal, PwordVal);
    string hashed = getMd5Hash2(source);
    byte[] ph1 = System.Text.Encoding.UTF8.GetBytes(hashed);

//Build Hyperlink...
         var sb = new StringBuilder();
 sb.AppendFormat("https://ExampleService/GetRptLength?ReportDate={0}&UserID={1}&PassHash={2}", ReportDate, UnameVal, ph1);
     HyperLink1.Visible = true;
     HyperLink1.NavigateUrl = sb.ToString();
}

static string getMd5Hash2(string input) {
    // Create a new instance of the MD5CryptoServiceProvider object.
    MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();

    // Convert the input string to a byte array and compute the hash.
    byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

    // Create a new Stringbuilder to collect the bytes
    // and create a string.
    StringBuilder sBuilder = new StringBuilder();

    // Loop through each byte of the hashed data 
    // and format each one as a hexadecimal string.
    for (int i = 0; i < data.Length; i++) {
        sBuilder.Append(data[i].ToString("x2"));
    }

    // Return the hexadecimal string.
    return sBuilder.ToString();
}
protectedvoid btnSubmit\u单击(对象发送方,事件参数e){
字符串UnameVal=“BSimpson”;
字符串PwordVal=“Springfield”;
字符串ReportDate=“2015-12-25”;
字符串源=string.Concat(UnameVal,PwordVal);
字符串哈希=getMd5Hash2(源);
byte[]ph1=System.Text.Encoding.UTF8.GetBytes(散列);
//建立超链接。。。
var sb=新的StringBuilder();
某人附言格式(“https://ExampleService/GetRptLength?ReportDate={0}&UserID={1}&PassHash={2}”,报告日期,UnameVal,ph1);
HyperLink1.Visible=true;
HyperLink1.NavigateUrl=sb.ToString();
}
静态字符串getMd5Hash2(字符串输入){
//创建MD5CryptoServiceProvider对象的新实例。
MD5CryptoServiceProvider md5Hasher=新的MD5CryptoServiceProvider();
//将输入字符串转换为字节数组并计算哈希。
byte[]data=md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
//创建新的Stringbuilder以收集字节
//并创建一个字符串。
StringBuilder sBuilder=新StringBuilder();
//循环遍历散列数据的每个字节
//并将每个字符串格式化为十六进制字符串。
for(int i=0;i
下面是构建超链接的示例


当我提交此链接时,它表明我有一个“无效密码哈希值”。不是应该为
PassHash
设置一个值,而不仅仅是
System.Byte[]
?我做错了什么?

您需要将字节数组转换为base64字符串,因为字节数组的
.ToString()
方法不会给出有效的表示形式

您可以通过以下方式执行此操作:

var passwordHashInBase64 = System.Convert.ToBase64String(ph1);
然后只需将
密码hashinbase64
传递给字符串生成器,而不是
ph1

编辑:

更仔细地看一下您的代码,您似乎在这里迈出了额外的一步。在getMd5Hash2函数中,在此行之后:

byte[]data=md5Hasher.ComputeHash(Encoding.Default.GetBytes(input))

返回系统.Convert.tobase64字符串(数据)

并删除stringbuilder/十六进制表示形式

然后,在提交事件中,不必担心从
散列中获取字节,只需将该字符串作为散列值传入即可


sb.AppendFormat(“https://ExampleService/GetRptLength?ReportDate={0}&UserID={1}&PassHash={2}”,ReportDate,UnameVal,hash)

谢谢你的回复,威廉。但是,当我尝试您的解决方案时,出现了以下错误,因为服务正在查找字节[]形式的“PassHash”:“ExampleService/GetRptLength(string,string,Byte[])的最佳重载方法有一些无效参数”现在如何将“hash”值作为字节[]发送?您控制端点了吗?您应该将PassHash的预期值更改为字符串,然后可以使用
System.Convert.FromBase64String从中获取字节。否,我不控制端点。然而,我确实从webservice的作者那里发现,我需要将数据散列为SHA256,而不是MD5。这是我的最新消息code://-----For SHA256哈希-------------------------------------------字符串哈希=Base64SHA256(源);字节[]ph1=Convert.FromBase64String(散列)//将参数传递给GetReportLength Web服务int a=RptLnth.GetReportLength(ReportDate,uneval,ph1);Label5.Text=“Rpt长度为”+a.ToString()。。。但它仍然不起作用。。。!