2016-12-01 5 views
0

これは非常に奇妙な質問です。マニフェストのpass.json文字列形式のため、.pkpassの作成に失敗しますか?

C#を使用してpass.jsonを作成し、memoryStreamに保存すると、正常に動作します。その後、私はそのpass.jsonを含むmanifest.json SHA1データを作成します。このようなmanifest.jsonの文字列は完全に正しいです。

{"icon.png":  "9423bd00e2b01c59a3265c38b5062fac7da0752d", 
"[email protected]": "4d1db55bdaca70b685c013529a1c0dcbd7046524", 
"logo.png":  "ee5b053e63dbfe3b78378c15d163331d68a0ede8", 
"[email protected]": "2f9e3a55bded1163620719a4d6c1ad496ed40c17", 
"pass.json": "fd68bf77757d3057263a9aca0e5110ddd933934a"} 

はそれがを開くことができない、私の携帯電話としてpkpassを生成します。 pass.json SHA1コードを "fd68bf77757d3057263a9aca0e5110ddd933934a"と変更すると、値を保存せずにが動作します。です。次のような

コーディング:

// This version run success 
var strPass = JavascriptSerialize(details); 
var sw = new StreamWriter(assetsFolder + @"pass.json"); 
sw.Write(strPass); 
sw.Close(); 
manifest.passjson = GetSha1Hash(assetsFolder + manifest.GetAssetBoardingPass(libPkPass_object_boardingPass.JsonObjects.AssetTypes.passjson)); 

//manifest.passjson = "2f9e3a55bded1163620719a4d6c1ad496ed40c17" 
// end 

// This version run fail 
var strPass = JavascriptSerialize(details); 
MemoryStream stream = new MemoryStream(); 
StreamWriter writer = new StreamWriter(strPass); 
writer.Write(s); 
writer.Flush(); 
stream.Position = 0; 
var a = GetSha1HashMemory(passStream); 
    private static string GetSha1HashMemory(Stream passStream) 
    { 

     //var bs = new BufferedStream(passStream); 
     using (SHA1Managed sha = new SHA1Managed()) 
     { 
      byte[] checksum = sha.ComputeHash(passStream); 
      string sendCheckSum = BitConverter.ToString(checksum) 
       .Replace("-", string.Empty); 
      return sendCheckSum.ToString().ToLower(); 
     } 
    } 
manifest.passjson = a; 

//manifest.passjson = "2f9e3a55bded1163620719a4d6c1ad496ed40c17" (same data) 
//end 

を何が起こっているか??????私は文字列が間違っているという質問を見つけることができます。 pkpassはhere(sendspace)で提供されます。

どこから間違っているのですか?

大きな感謝!

答えて

0

つミス:ストリームを用い
ComputeHash(ストリーム)

ComputeHash(ストリーム)のみSystem.IO.Streamを使用ComputeHashストリームではなく、MemoryStreamを、ComputeHashへの変更(バイト[] )はそれを処理することができます

ストリームを使用してストリーム:私は他の関数にストリームを渡そうとします、良い例ではない、ストリームは新しいストリームを作成する必要があります。この場合、私はこの関数を新しいものを開いて呼び出す必要があります。それは修正されます

   StringBuilder formatted; 
       using (var sha1 = new SHA1Managed()) 
       { 
        //var bytePass = ReadFully(passStream); 
        var bytePass = passStream.ToArray(); 
        var hash = sha1.ComputeHash(bytePass); 
        formatted = new StringBuilder(2 * hash.Length); 
        foreach (var b in hash) 
        { 
         formatted.AppendFormat("{0:X2}", b); 
        } 
       } 
       manifest.passjson = formatted.ToString().ToLower(); 
関連する問題