Google の Safe Browsing API から返されたプロトコル バッファをデコードしようとしています。
私は C# を使用していますが、ほぼ同じであるため、Java ソリューションも機能します。
私の現在の不完全なコードはこのようなものです
public void Download()
{
var lists = new List<string>
{
"goog-malware-shavar",
"goog-unwanted-shavar",
"googpub-phish-shavar"
};
var protocol = "https://";
var uriBase = $"safebrowsing.google.com/safebrowsing/downloads?client=api&key={_googleSafeBrowsingApiKey}&appver=1.5.2&pver=3.0";
var requestUrl = protocol + uriBase;
var content = new StringContent("googpub-phish-shavar;\ngoog-malware-shavar;\ngoog-unwanted-shavar;\n");
using (var client = new HttpClient())
{
var httpResult = client.PostAsync(requestUrl, content).Result;
var result = httpResult.Content.ReadAsStringAsync().Result;
var lines = result.Split('\n');
var firstUrl = lines[2].Substring(2);
var newRes = client.GetAsync("https://" + firstUrl).Result.Content.ReadAsByteArrayAsync().Result;
var len = BitConverter.ToUInt32(newRes, 0);
var newArray = newRes.Skip(3).Take((int)len).ToArray();
try
{
ChunkData chunk =
ChunkData.Parser.ParseFrom(newArray);
if (chunk == null)
{
}
}
catch
{
}
}
}
ChunkData.Parser.ParseFrom に何を渡すかよくわかりません
ドキュメントによると、結果は符号なし 32 ビット整数で始まるはずなので、なぜ var len = BitConverter.ToUInt32(newRes, 0) を使用してこの数値を取得しようとしたのでしょう。これはチャンク内のバイト数であるべきだと思っていましたが、この数はバイト配列全体よりもはるかに大きくなっています。
バイト配列の正しい断片を ChunkData パーサーに渡すにはどうすればよいですか?