I'm using this code to convert the unsigned char* (points to an array of 256 values) to std::string:
int ClassA::Func(unsigned char *dataToSend, int sendLength)
{
std::stringstream convertStream;
std::string dataToSendStr = "";
for(int i=0; i<=sendLength; i++) convertStream << dataToSend[i];
while(!convertStream.eof()) convertStream >> dataToSendStr;
...
}
but then I have dataToSendStr in this format:
dataToSendStr ""
[0] 0x00
[1] 0x00
[2] 0x04
[3] 0xC0
if I now use this value I only get "" and not the important values [0-3]!
-> need something like: dataToSendStr "000004C0"
Thx for your help!
Use the IO manipulator std::hex if you want (which is what I think based on the need something like part of the question) a hexadecimal representation of the characters in dataToSend:
std::ostringstream convertStream;
convertStream << std::hex << std::setfill('0');
for (int i = 0; i < sendLength; i++)
{
convertStream << std::setw(2) << static_cast<short>(dataToSend[i]);
}
Related
std::stringstream sstream;
uint8_t data[1] = { };
int x =1;
sstream << "0x" << std::hex << x; //sstream = 0x04b35cc8 "0x1" why the sstream not be only "0x1"
uint8_t result= (uint8_t)sstream.str().c_str();// result= 80
data[0] = { result};
the function that I want to implement do:
1- convert to hex. For example 1 converted to 0x01 ( Is there another way rather than using stringstream)
2- store the result in uint8_t variable in order to assign it to data[0]
I'm not used to C++, so bear with me...
Two bytes are read from a device and gets in a buffer.
It is then to be printed.
The code below is supposed to return the string "0x204D"
However, it returns "0x M" which in hex is 30 78 20 4d
So the hex is not decoded to ascii.
void vito_unit::decodeAsRaw(unsigned char *buffer, int bufferLen)
{
std::stringstream *decodedClearText;
decodedClearText = new std::stringstream;
*decodedClearText << "0x" << std::hex;
for (int i=0; i<bufferLen; i++) {
*decodedClearText << buffer[i];
}
setValue(decodedClearText->str());
}
How should it be done?
This has nothing to do with std::hex.
When you stream a [signed/unsigned] char, its ASCII representation is used, because that is usually what is expected of chars.
You can stream a number instead by converting it to int. Then the feature that renders numbers in hexadecimal notation (i.e. std::hex) will be triggered.
You should also fix that memory leak and unnecessary dynamic allocation:
void vito_unit::decodeAsRaw(unsigned char const* const buffer, int const bufferLen)
{
std::stringstream decodedClearText;
decodedClearText << "0x" << std::hex;
for (int i = 0; i < bufferLen; i++) {
decodedClearText << +buffer[i];
}
setValue(decodedClearText.str());
}
The unary "+" performs an integral promotion to int.
buffer[i] is of type unsigned char and is thus printed as a character instead of its hexadecimal representation. You can cast the value to an unsigned int to avoid that.
void vito_unit::decodeAsRaw(unsigned char *buffer, int bufferLen)
{
std::stringstream *decodedClearText;
decodedClearText = new std::stringstream;
*decodedClearText << "0x" << std::hex;
for (int i=0; i<bufferLen; i++) {
*decodedClearText << (unsigned int) buffer[i];
}
setValue(decodedClearText->str());
}
The hint from Bo Persson was what I needed.
for (int i=0; i<bufferLen; i++) {
*decodedClearText << (int)buffer[i];
}
did the trick.
I have an array of hexadecimals and I need to convert it to string.
my array:
// declaration
unsigned char HEX_bufferMessage[12];
// initialize
HEX_bufferMessage[0] = 0xF0;
HEX_bufferMessage[1] = 0x15;
HEX_bufferMessage[2] = 0x31;
HEX_bufferMessage[3] = 0x02;
HEX_bufferMessage[4] = 0x03;
HEX_bufferMessage[5] = 0x00;
HEX_bufferMessage[6] = 0x00;
HEX_bufferMessage[7] = 0xD1;
HEX_bufferMessage[8] = 0xD1;
HEX_bufferMessage[9] = 0x00;
HEX_bufferMessage[10] = 0x00;
HEX_bufferMessage[11] = 0xF7;
I only have these informations in hexadecimal format, I need to convert them to string. Anyone know how I can do it??
Thank you!!
Late to the party, but since all the answers using std::to_string() fail to output the hex values as hex values, I suggest you send them to a stream, where you can format your output via std::hex:
std::cout << "0x" << std::hex << HEX_bufferMessage[0] << std::endl;
or, if you want to use it in a string:
std::string to_hex_string( const unsigned int i ) {
std::stringstream s;
s << "0x" << std::hex << i;
return s.str();
}
or even in a single line:
// ...
return (static_cast<std::stringstream const&>(std::stringstream() << "0x" << std::hex << i)).str();
std::bitset<16> foo(HEX_bufferMessage[0]);
std::string s = foo.to_string();
http://en.cppreference.com/w/cpp/utility/bitset/to_string
Use : std::to_string
for (size_t i =0 ; i<10; ++i)
{
std::string s { std::to_string(HEX_bufferMessage[i]) }; //ith element
std::cout << s; //concatenate all s as per need
}
something like this?
const char *hex = "0123456789ABCDEF";
unsigned char x = 0xF8;
std::cout << "0x" << hex[x >> 4 & 0xF] << hex[x & 0xF] << std::endl;
How about std::to_string?
Like
std::string s;
for (auto const& v : HEX_bufferMessage)
s += std::to_string(v);
char hex_string[12*2+1]; /* where 12 - is the number of you hex values, 2 - is 2 chars per each hex, and 1 is the final zero character */
for(int i=0;i<12;++i) {
sprintf(hex_string+i*2,"%x", HEX_bufferMessage[i]);
}
I have done some research on how to convert an int to Hex string and found an answer, however what i need is a little bit different as you can see in the following code:
int addr = 5386; //
std::string buffer = "contains 0xCCCCCCCC as hex (non ASCII in the string)";
size_t idx = 0;
idx = buffer.find("\xCC\xCC\xCC\xCC", idx);
if (idx != string::npos) buffer.replace(idx, 4, XXX); // here i want to put the addr variable but as 0x0000150A
What i need is a way to convert the addr variable to a hex string that has the \x in between the bytes like "\x0a\x15\x00\x00"
Thanks in advance.
Maybe this program would help you :
#include <sstream>
#include <iomanip>
#include <iostream>
int main(int argc, char const *argv[])
{
int a = 5386;
std::ostringstream vStream;
for(std::size_t i = 0 ; i < 4 ; ++i)
vStream << "\\x"
<< std::right << std::setfill('0') << std::setw(2) << std::hex
<< ((a >> i*4) & 0xFF);
std::cout << vStream.str() << std::endl;
return 0;
}
I am not sure I precisely got your problem, but I understand you want an int to be transformed into a string in format : "\xAA\xAA\xAA\xAA".
It uses std::right, std::setfill('0') and std::setw(2) to force an output of "2" to be "02". std::hex is to get the hexadecimal representation of a integer.
You may want to treat addr as char*, but you will have issues with endianness.
you may do the job manually with something like:
unsigned int addr = 5386 // 0x0000150A
char addrAsHex[5] = {(addr >> 24) & 0xFF, (addr >> 16) & 0xFF, (addr >> 8) & 0xFF, addr & 0xFF, 0};
// ...
buffer.replace(idx, 4, addrAsHex);
Something like this:
char buf[20];
uint32_t val;
sprintf(buf, "\\x%02x\\x%02x\\x%02x\\x%02x",
(val >> 24), (uint8_t)(val >> 16), (uint8_t)(val >> 8), (uint8_t)val);
I have tried to find this topic on the web but I couldn't find the one I need.
I have a string of character:
char * tempBuf = "qj";
The result I want is 0x716A, and that value is going to be converted into decimal value.
Is there any function in vc++ that can be used for that?
You can use a stringstream to convert each character to a hexadecimal representation.
#include <iostream>
#include <sstream>
#include <cstring>
int main()
{
const char* tempBuf = "qj";
std::stringstream ss;
const char* it = tempBuf;
const char* end = tempBuf + std::strlen(tempBuf);
for (; it != end; ++it)
ss << std::hex << unsigned(*it);
unsigned result;
ss >> result;
std::cout << "Hex value: " << std::hex << result << std::endl;
std::cout << "Decimal value: " << std::dec << result << std::endl;
}
So if I understood correctly the idea...
#include <stdint.h>
uint32_t charToUInt32(const char* src) {
uint32_t ret = 0;
char* dst = (char*)&ret;
for(int i = 0; (i < 4) && (*src); ++i, ++src)
dst[i] = *src;
return ret;
}
If I understand what you want correctly: just loop over the characters, start to finish; at each character, multiply the sum so far by 256, and add the value of the next character; that gives the decimal value in one shot.
What you are looking for is called "hex encoding". There are a lot of libraries out there that can do that (unless what you were looking for was how to implement one yourself).
One example is crypto++.