Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read hex text format 0x from stream

Tags:

c++

text

stream

hex

I'm looking for a simple method to read a hex value from a text file using streams. I searched Stack Overflow using "C++ hex read stream 0x" and most of responses were about writing hex as text or reading in hex values without the "0x" prefix. This question is about reading the hex number, with "0x" prefix as a number in one operation.

My method:

unsigned char byte;
std::istringstream sample("0xce");
sample >> std::hex >> byte;

Ends up with byte containing '0' (0x30) from the first character.

The 'strtol` function handles the conversion, but requires reading the data, converting to C-style string.

I'm overloading the operator>> in a class to read a comma separated value (CSV) text file. Here is a sample of the data file:

1,-4.93994892,0xa5,8,115.313e+3,
2,-4.93986238,0xc0,8,114.711e+3,
3,-4.93977554,0xc2,8,114.677e+3,

My extraction method:

class Csv_Entry
{
public:
    friend std::istream& operator >>(std::istream& inp, Csv_Entry& ce);
    unsigned int    m_index;
    double      m_time;
    unsigned char   m_byte;
    unsigned int    m_data_length;
    double      m_bit_rate;
};

std::istream&
operator >> (std::istream& inp, Csv_Entry& ce)
{
    char    separator;
    inp >> ce.m_index;
    inp >> separator;
    inp >> ce.m_time;
    inp >> separator;
    inp >> std::hex >> ce.m_byte;
    inp >> separator;
    inp >> ce.m_data_length;
    inp >> separator;
    inp >> ce.m_bit_rate;
    inp.ignore(10000, '\n');
    return inp;
}

Do I need to use std::setw?

Edit 1:
I'm using Visual Studio 2010 Premium on Windows 7, 64-bit platform.

like image 921
Thomas Matthews Avatar asked Aug 02 '11 17:08

Thomas Matthews


People also ask

What is 0x hexadecimal?

The prefix 0x is used in code to indicate that the number is being written in hex. But what is 'B' doing in there? The hexadecimal format has a base of 16, which means that each digit can represent up to 16 different values.


1 Answers

A solution is to read the value using an unsigned int then convert to unsigned char:

unsigned int value;
inp >> hex >> value;
unsigned char byte;
byte = value & 0xFF;

I guess there is something about the type unsigned char that is causing the issue.

Any C++ language lawyers can quote a section that describes this behavior?

like image 168
Thomas Matthews Avatar answered Oct 10 '22 23:10

Thomas Matthews