Skip to content

Instantly share code, notes, and snippets.

@mgravell
Created August 27, 2020 14:04
Show Gist options
  • Save mgravell/c01f7d64d78e0dec40d0f08405cd9364 to your computer and use it in GitHub Desktop.
Save mgravell/c01f7d64d78e0dec40d0f08405cd9364 to your computer and use it in GitHub Desktop.
using ProtoBuf;
using System;
using System.IO;
static class Funchelper
{
static void Main()
{
var obj = new NotAForm();
obj.DoTheThing();
}
public static byte[] HexStrTobyte(string hex)
{ // I'm guessing some code here...
hex = hex.Replace(" ", "");
var blob = new byte[hex.Length / 2];
for (int i = 0; i < blob.Length; i++)
{
blob[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
}
return blob;
}
public static string byteToHexStr(byte[] bytes)
{
string returnStr = "";
if (bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
returnStr += bytes[i].ToString("X2") + " ";//ToString("X2") 为C#中的字符串格式控制符
}
}
return returnStr;
}
}
class NotAForm
{
public void DoTheThing() => button1_Click(this, EventArgs.Empty);
private void button1_Click(object sender, EventArgs e)
{
string data = "ClgKCjE2NDMzMTAwMDISDkxvcmRjVmVqZ3dCYTRtGgAgATgBQABIAFiorbuY6KxeYNqdE2iF+AVw0O2S3aEueJygqMLngmGAAbLXy48GkAEAmAEAoAEAqAEDEAgYqIaZxbwuKiw3bUpoYmlUL29nM0trSkZ0T2duK3Rkcys2TG9OcFdoZzdGZUlnQmF4ZkgwPTINaHR0cHM6Ly8uY29tLzix18uPBkIGT25saW5lSAA=";
byte[] data2 = System.Convert.FromBase64String(data);
data = Funchelper.byteToHexStr(data2);
Console.WriteLine(ProtobufDecode(data));
}
static string WriteTree(ProtoReader reader)
{
string JSONstring = null;
JSONstring = "[";
while (reader.ReadFieldHeader() > 0)
{
Console.WriteLine(reader.FieldNumber);
Console.WriteLine(reader.WireType);
switch (reader.WireType)
{
case WireType.String:
string dataStr = null;
byte[] dataByte = null;
dataByte = ProtoReader.AppendBytes(null, reader);
if (dataByte[0].ToString() == "10")
{
dataStr = Funchelper.byteToHexStr(dataByte);
dataStr = ProtobufDecode(dataStr);
}
else
{
dataStr = Convert.ToString(dataByte);
}
JSONstring += "{";
JSONstring += "\"" + "FieldNumber" + "\":\"" + reader.FieldNumber + "\",";
JSONstring += "\"" + "WireType" + "\":\"" + reader.WireType + "\",";
JSONstring += "\"" + "Value" + "\":\"" + dataStr + "\",";
JSONstring += "},";
break;
case WireType.StartGroup:
// one of 2 sub-object formats
var tok = ProtoReader.StartSubItem(reader);
WriteTree(reader);
ProtoReader.EndSubItem(tok, reader);
break;
default:
reader.SkipField();
break;
}
}
char[] specialChars = new char[] { ',' };
JSONstring = JSONstring.TrimEnd(specialChars);
JSONstring += "]";
return JSONstring;
}
static string ProtobufDecode(string checkHex)
{
byte[] data = Funchelper.HexStrTobyte(checkHex);
using (var ms = new MemoryStream(data))
{
try
{
var test = ProtoReader.Create(ms, null, null);
string datatest = WriteTree(test);
return datatest;
}
catch { }
}
return System.Text.Encoding.ASCII.GetString(Funchelper.HexStrTobyte(checkHex));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment