Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

Parsing hex values from an xml file

Posted on 2012-03-30
11
Medium Priority
?
234 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
9 Comments
 
LVL 10

Expert Comment

by:Pierre François
ID: 37789370
No problem. In which language do you want to code?
0
 
LVL 84

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
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 84

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 35

Assisted Solution

by:sarabande
sarabande earned 750 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 750 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

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
Introduction In my previous article (http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/SSIS/A_9150-Loading-XML-Using-SSIS.html) I showed you how the XML Source component can be used to load XML files into a SQL Server database, us…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
Suggested Courses

810 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