Solved

Parsing hex values from an xml file

Posted on 2012-03-30
11
206 Views
Last Modified: 2012-09-12
I am converting a software application from reading and parsing a standard ASCII text file containing operational parameters to an input file in XML format. One of the parameters needs to be a sequence of bytes. Each byte can have a value from 0x00 to 0xFF. So a sample line from the XML file might then be:
<value>0x34 0x3 0x08 0xf2 0xD7 0X39</value>
Note that I purposely presented variations in the format of how a user might populate this field. What is the best way to convert that string into an array of bytes with these values?
0
Comment
Question by:bbrms
  • 2
  • 2
  • 2
  • +3
11 Comments
 
LVL 10

Expert Comment

by:pfrancois
ID: 37789370
No problem. In which language do you want to code?
0
 
LVL 83

Expert Comment

by:Dave Baldwin
ID: 37789430
Actually, there will be problems because a number of characters are not legal in XML.  Only a few control characters are allowed and four characters must be 'escaped' to be included in an XML document.  http://www.w3.org/TR/2000/REC-xml-20001006#charsets

XML is supposed to be a text format.  The standard says you can use % encoding for unrecognized characters.  There is nothing, however, about a real 'byte array'.
0
 

Author Comment

by:bbrms
ID: 37789461
I apologize. I forgot to mention the language. I am coding in C++.  
Per Dave’s comment: please note that my example demonstrates that I am inputting a  human-readable ASCI string that contains only digits, spaces and the letters A through F in any combination of lower and upper case. This should pose no problem for  XML. The application will process the string and convert the text to  an array of bytes corresponding to the string. I can code up my own solution using sscanf() but I am hoping that there is a solution that is more elegant than that and less time-consuming to code. The string can have any number of hexadecimal  values designated (i.e. the size of the string can be from zero to N, where N is probably limited to a few hundred at the most, and that is a fringe case)
0
Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

 
LVL 83

Expert Comment

by:Dave Baldwin
ID: 37789619
I misunderstood.  I thought you were trying to put the byte array into the XML.
0
 
LVL 75

Expert Comment

by:Michel Plungjan
ID: 37849173
0
 

Author Comment

by:bbrms
ID: 37849775
mplungjan provded a google search for C++ string representation of  hex. If you read my two posts carefully under this topic you will see that I already have a string of hex characters being parsed by my XML parser. When I posted this originally I had hoped that some expert user of XML would know of a routine available from perhaps some open source utility that would process the text line as I described it and generate perhaps a vector<uint_8> container of translated values from that string, without being sensitive to case of the 'x' character, the number of spaces or tabs and other wise be very tolerant in its range of acceptable syntax for the input string. I don't believe what I was looking for exists based on the posts I am getting, so I have coded up my own solution.
0
 
LVL 75

Expert Comment

by:Michel Plungjan
ID: 37849907
I asked because the top links gave examples of how to convert strings back to binary.
I am not at all a c programmer but since the question was not commented on at all I hoped I could at least get you started.
Feel free to post what you ended up with and accept your own comment as answer.
0
 
LVL 33

Assisted Solution

by:sarabande
sarabande earned 250 total points
ID: 37851864
the below code should do

 std::string s = "0x34 0x3 0x08 0xf2 0xD7 0X39";
 std::istringstream istmp(s);
 std::vector<unsigned char> v;
 unsigned int b;
 char c1, c2;
 while (istmp >> c1 >> c2 >> std::hex >> b)
 {
       if (c1 != '0' || toupper(c2) != 'X' || b >= 256)
            break;
        v.push_back((unsigned char)b);
 }

Open in new window


Sara
0
 
LVL 1

Accepted Solution

by:
philrosenberg earned 250 total points
ID: 37854839
You could simplify Sara's code by using showbase I think
   fstream fin;
   //code to open file and read to correct place
   unsigned int hexnumber;
   unsigned char hexbyte;
   fin >> std::showbase >> std::hex >> hexnumber;
   hexbyte=(unsigned char) hexnumber;

Open in new window

Phil
0

Featured Post

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Header of docx file 17 115
XML Removal- Powershell 4 29
XML Document XPath with Namespaces 3 27
XML extra information 8 29
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
The Confluence of Individual Knowledge and the Collective Intelligence At this writing (summer 2013) the term API (http://dictionary.reference.com/browse/API?s=t) has made its way into the popular lexicon of the English language.  A few years ago, …
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

828 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question