Search code examples
c#barcode-scanner

How to print only datalabel out of whole scandata?


I am a new bee to C# programming. I have a zebra bar code scanner. I made a C# code according to the software user manual. I am able to print the scandata. However this data consist of all the information about the scanner. It has serial number,module number,GUID,datatype and datalabel.

This datalabel is the information about the bar code. I am interested in this datalabel only. I need to develop further code using this datalabel.

How can I print only the datalabel?.

Here I am attaching my code. Thank you.

namespace ConsoleApp_scandata
{
  class Program
  {
    //declare the core scanner class 
    static CCoreScannerClass cCoreScannerClass;
    static void Main(string[] args)
    {

        cCoreScannerClass = new CoreScanner.CCoreScannerClass();

        //CALL OPEN API
        short[] scannerTypes = new short[1];        //scanner types intrested in
        scannerTypes[0] = 1;                        // set all scanner types to 1
        short numberOfScannerTypes = 1;             // size of the scanner type array 
        int status;                                 // Extend API return code

        cCoreScannerClass.Open(0, scannerTypes, numberOfScannerTypes, out status);

        if (status == 0)
            Console.WriteLine("CoreScanner API OPEN");
        else
            Console.WriteLine("CoreScanner API CLOSED");

        // Lists all scanners connected to the host computer.
        // will return nothing

        short numberOfScanners;
        int[] connectedScannerIDList = new int[255];

        string outXML;

        cCoreScannerClass.GetScanners(out numberOfScanners, connectedScannerIDList, out outXML, out status);

        //below does not work because string is an xml file and is never NULL
        Console.WriteLine(outXML);
        // Console.WriteLine(outXML.ToString()); 
        cCoreScannerClass.BarcodeEvent += new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
        int opcode = 1001;
        string inXML = "<inArgs>" +
            "<cmdArgs>" +
            "<arg-int>1</arg-int>" +
            "<arg-int>1</arg-int>" +
            "</cmdArgs>" +
            "</inArgs>";
        cCoreScannerClass.ExecCommand(opcode, ref inXML, out outXML, out status);

        opcode = 2011;
        inXML = "<inArgs>" +
           "<scannerID>1</scannerID>" +
              "</inArgs>";
        cCoreScannerClass.ExecCommand(opcode, ref inXML, out outXML, out status);
       

        while (true)
        {
            Console.Read();
        }
        
    }

    private static void OnBarcodeEvent(short eventType, ref string pscanData)
    {
        Console.WriteLine("Scannner Event! Scan Data: " + pscanData);
    }
  }
}

enter image description here


Solution

  • Load pscanData in the XmlDocumentand your are ready to go, just copy this code:


    private static void OnBarcodeEvent(short eventType, ref string pscanData)
    {
        Console.WriteLine("Scannner Event! Scan Data: " + pscanData);
    
        XmlDocument xmlDoc = new XmlDocument();
    
        //xmlDoc.LoadXml(pscanData); //You should use this line as far as your XML tags are correct
        xmlDoc.LoadXml("<scandata>" +
    
                       "<modeldata>" +
                       "099909" +
                       "</modeldata>" +
    
                       "<datalabel>" +
                       "0x68 0x74 0x74" +
                       "</datalabel>" +
    
                       "</scandata>"); //I use this harcoded XML because I don't have your pscanData, just delete this line and uncoment the one above
    
        XmlNodeList datalabel = xmlDoc.GetElementsByTagName("datalabel");
        XmlNode allInDataLabel = datalabel.Item(0);
        string whatDatalabelContains = allInDataLabel.InnerText;
    
        Console.WriteLine("Datalabel: " + ToText(whatDatalabelContains));
    }
    

    Edit: Hex to text


    private static string ToText(string yourHex)
    {
        StringBuilder sb = new StringBuilder();
        string[] dataArr = yourHex.Split(new char[] { ' ' });
    
        for (int i = 0; i < dataArr.Length; i++)
        {
            sb.Append(Char.ConvertFromUtf32(Convert.ToInt32(dataArr[i], 16)));
        }
    
        return sb.ToString();
    }