Visual Studio 2019
dotPeek - for reverse engineering plug-in DLL
SDR#
TETRA demodulator plug-in version 1.0.14.0 (SDRSharp.TETRADemodulator)

Show SDS type 4 messages always as binarystring and hexadecimal string.

Modify SdsMessage.cs

namespace SDRSharp.Tetra
{
  public class SdsMessage
  {
    public string TextString { get; set; }

    public string BinaryString { get; set; }

    //ADDX
    public string BinaryString2 { get; set; } //add this
  }
}

 

Modify SdsParser.cs

    public unsafe void ParseTextMessage(
      LogicChannel channelData,
      int offset,
      int length,
      Dictionary<GlobalNames, int> result)
    {
      int num1 = 0;
      string empty = string.Empty;
      int key = 0;
      int offset1 = offset;
      Dictionary<int, SdsMessage> dictionary1 = new Dictionary<int, SdsMessage>();
      SdsMessage sdsMessage = new SdsMessage();
      sdsMessage.TextString = string.Empty;
      sdsMessage.BinaryString = string.Empty;
      //ADDX
      sdsMessage.BinaryString2 = string.Empty; //add this

      if (!result.TryGetValue(GlobalNames.Protocol_identifier, out num1))
        return;
      //ADDX
      sdsMessage.BinaryString2 = TetraUtils.BitsToString(channelData.Ptr, offset, length); // add this
      int num2 = 0;

 

NetInfoWindow.cs

public void UpdateTextBox(List<Dictionary<GlobalNames, int>> rawData)
....
              if (dictionary.TryGetValue(GlobalNames.SDS_Text_here, out num2))
              {
                string empty2 = string.Empty;
                int key = 0;
                SdsMessage sdsMessage1 = new SdsMessage();
                sdsMessage1.TextString = string.Empty;
                sdsMessage1.BinaryString = string.Empty;
                //ADDX
                sdsMessage1.BinaryString2 = string.Empty; // add this
                dictionary.TryGetValue(GlobalNames.Message_reference, out key);
               for (int index1 = 0; index1 < SdsParser.SdsMessages.Count; ++index1)
                {
                  Dictionary<int, SdsMessage> sdsMessage2 = SdsParser.SdsMessages[index1];
                  if (sdsMessage2.ContainsKey(key))
                  {
                    sdsMessage2.TryGetValue(key, out sdsMessage1);
                    for (int index2 = 0; index2 < index1 + 1; ++index2)
                      SdsParser.SdsMessages.RemoveAt(0);
                    break;
                  }
                }
                if ((sdsMessage1.TextString != null || sdsMessage1.BinaryString != null) && (sdsMessage1.TextString != string.Empty || sdsMessage1.BinaryString != string.Empty))
                {
                  if (num2 == 2)
                    str2 = str2 + " TEXT:'" + sdsMessage1.TextString + "'";
                  if (num2 == 3)
                    str2 = str2 + " DATA:'" + sdsMessage1.BinaryString + "'";
                }
                //ADDX -- add these lines
                if (string.IsNullOrEmpty(sdsMessage1.BinaryString2) == false)
                {
                   str2 = str2 + Environment.NewLine + "BIN " + sdsMessage1.BinaryString2;
                   var hex = string.Join(":",
                             Enumerable.Range(0, sdsMessage1.BinaryString2.Length / 8)
                             .Select(i => Convert.ToByte(sdsMessage1.BinaryString2.Substring(i * 8, 8), 2).ToString("X2")));
                }
                // END OF ADDX
              }
              if (dictionary.TryGetValue(GlobalNames.Time_data_type, out num2))
...

vs-scr.jpg
https://i.ibb.co/Q9sR9w8/vs-scr.jpg