|
If I got you, the code should return the hexadecimal representation of a bunch of bytes.
In order to avoid CRT-conflicts, you have to make the caller responsible of the output buffer allocation/deallocation. Something like this
#include <iostream>
#include <cstddef>
using namespace std;
size_t to_hex( unsigned char in[], size_t size_in, char out[], size_t size_out)
{
size_t n;
for (n=0; (n < size_in) && (n < (size_out-1)b/2); ++n)
{
unsigned char nibble;
nibble = (in[n] >> 4); out[2*n] = nibble < 10 ? nibble + '0' : nibble - 10 + 'A';
nibble = (in[n] & 15); out[2*n+1] = nibble < 10 ? nibble + '0' : nibble - 10 + 'A';
}
if ( 2*n < size_out)
out[2*n] = '\0';
return n;
}
int main()
{
unsigned char small[] = { 0x25, 0x37, 0x48, 0x42, 0x42 };
char buffer[41];
size_t size = to_hex( small, sizeof(small), buffer, sizeof(buffer));
cout << "converted bytes " << size << ", hex string " << buffer << "\n";
unsigned char large[256];
for (size_t n=0; n<256; ++n)
{
large[n] = n;
}
size = to_hex( large, sizeof(large), buffer, sizeof(buffer));
cout << "converted bytes " << size << ", hex string " << buffer << "\n";
}
"In testa che avete, Signor di Ceprano?"
-- Rigoletto
|
|
|
|
|
Ooops, wrong forum section. Can a moderator please delete this thread (the Delete link is disabled for me)?
modified 10-Jan-23 8:24am.
|
|
|
|
|
That doesn't look like C++ to me. Are you sure you didn't mean to post this in the C# forum[^] instead?
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
If this is truly C# code, mightn't you be better served posting it in the C# forum?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Hi
I have a number of hex data I am trying to get to printable data I mean ascii
I read them as a byte[] array where byte is typedef for usigned char
I just got this idea it might be easier to manipulate it as string i mean like std::string
so I developed this routine
string convertToString(unsigned char* a, int size)
{
int i;
string s = "";
for (i = 0; i < size; i++) {
s += a[i];
}
return s;
}
Here is the piece of code that calls it
returnsource->stmt = convertToString(sourcerecordpointer->statementnumber, 4)
here is the definition
BYTE statementnumber[4];
the data in statement ithe statement number in hex so statement 1 would be
x'00000001'
so my goal the would be to retrun
retrun->stmt as character 0001 or x30303031
Now me thinks that since return->stmt is defined as a string
struct source
{
string stmt;
string loc;
string addr1;
string addr2;
that the string operator= is invoked becasue of this
I end up here in Microsoft code in a member utility and get a read exception
this is the path
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.34.31933\include\utility
is there any way I can tell MSVC compiler that all I am trying to do with = operator is accept a return value from my subroutine
template <class _Ty, class _Other = _Ty>
_CONSTEXPR20 _Ty exchange(_Ty& _Val, _Other&& _New_val) noexcept(
conjunction_v<is_nothrow_move_constructible<_Ty>, is_nothrow_assignable<_Ty&, _Other>>) {
_Ty _Old_val = static_cast<_Ty&&>(_Val);
_Val = static_cast<_Other&&>(_New_val);
return _Old_val;
}
|
|
|
|
|
Since one of the constructors for std::string is
std::string(const char *, size_t count) you can do your assignment using
unsigned char datum[6]{ 'A', 'B', 'C', 'D', 'E', 'F' }; std::string str(reinterpret_cast<const char *>(datum), 4);
Since you're getting a read exception, that suggests to me that given
returnsource->stmt = convertToString(sourcerecordpointer->statementnumber, 4); then probably your sourcrecordpointer is invalid.
Keep Calm and Carry On
|
|
|
|
|
Just an fyi
When I removed the return value
Meaning
I just had convetToString(sourcerecordpointer->statementnumber,4);
I didn’t get the exception me thinks it has something to do with the lvalue
|
|
|
|
|
ForNow wrote: I have a number of hex data I am trying to get to printable data I mean ascii
I read them as a byte[] array where byte is typedef for usigned char
I just got this idea it might be easier to manipulate it as string i mean like std::string
I think it is not a good idea to consider a byte array as a string. It is only possible if you are 100% sure there is no any NULL (0x00) byte within this byte array, otherwise you string would represent only the part of the array up to the first NULL byte.
|
|
|
|
|
That’s a good idea when I read the byte array for any value between 0x00 and 0x09 I’ll add 48
Those values between 0x0a and 0x0f I’ll add 55
After I finish inserting the bytes do I have to add a null 0x00 to complete the string or string will do that automatically ?
|
|
|
|
|
ForNow wrote: After I finish inserting the bytes do I have to add a null 0x00 to complete the string or string will do that automatically ?
If you mean an std::string then you you don't have to add a terminating null character.
|
|
|
|
|
Thanks I think the fact that I was inserting a null byte into a string caused the assertion
Thank you
|
|
|
|
|
I compiled, with Visual C++ 2022, and run (successfully) the following code:
#include <iostream>
using namespace std;
typedef unsigned char BYTE;
struct source
{
string stmt;
string loc;
string addr1;
string addr2;
};
string convertToString(unsigned char* a, int size)
{
int i;
string s = "";
for (i = 0; i < size; i++) {
s += a[i];
}
return s;
}
int main()
{
BYTE statementnumber[4];
source * returnsource = new source;
returnsource->stmt = convertToString(statementnumber, 4);
delete returnsource;
}
"In testa che avete, Signor di Ceprano?"
-- Rigoletto
|
|
|
|
|
I look at my code again the only difference I see is that my code is part of a DLL the pointer “return source” is a parameter passed by the invoking program it allocated on the heap via new
Thanks
|
|
|
|
|
Hi,
I want to work with a MYSQL database with jdbc using C++.
I have started with connection and I saw in an example the following statement:
con = driver->connect("host", "usert", "password");
I found the connect declaration in the driver.h header as a connection type, but I don't know where to find the definition of the connect.
Can anybody help me please with finding its definiton?
Thank you,
|
|
|
|
|
|
|
Yes, I have installed Connector C++ 8.0, in the link below it is explained that Conector C++ 8.0 supports "legacy C++ API based on the JDBC4",
and there is an exemplified code where appear the "connect" statement, and I am not able to understand where is defined to see it's functions or more
details.
https://dev.mysql.com/doc/dev/connector-cpp/8.0/jdbc_ref.html
Thank you.
|
|
|
|
|
I think you will need to search the documentation, or use the MySQL forum.
|
|
|
|
|
When I installed Connector C++, there were unziped the headers that contains declarations of classes and functions.
I suposed that is logical to find the declaration of these functions, clases constructors etc on those .h files.
I found connect declaration in driver.h file:
class CPPCONN_PUBLIC_FUNC Driver
{
protected:
virtual ~Driver() {}
public:
virtual Connection * connect(const sql::SQLString& hostName, const sql::SQLString& userName, const sql::SQLString& password) = 0;
virtual Connection * connect(ConnectOptionsMap & options) = 0;
virtual int getMajorVersion() = 0;
virtual int getMinorVersion() = 0;
virtual int getPatchVersion() = 0;
virtual const sql::SQLString & getName() = 0;
virtual void setCallBack(sql::Fido_Callback &cb) = 0;
virtual void setCallBack(sql::Fido_Callback &&cb) = 0;
virtual void threadInit() = 0;
virtual void threadEnd() = 0;
};
And I found that the connection type(or class) of the connect defined in the connection.h file:
class CPPCONN_PUBLIC_FUNC Connection
{
Connection(const Connection &);
void operator=(Connection &);
public:
Connection() {};
virtual ~Connection() {};
virtual void clearWarnings() = 0;
virtual Statement *createStatement() = 0;
virtual void close() = 0;
virtual void commit() = 0;
virtual bool getAutoCommit() = 0;
virtual sql::SQLString getCatalog() = 0;
virtual Driver *getDriver() = 0;
virtual sql::SQLString getSchema() = 0;
virtual sql::SQLString getClientInfo() = 0;
virtual void getClientOption(const sql::SQLString & optionName, void * optionValue) = 0;
virtual sql::SQLString getClientOption(const sql::SQLString & optionName) = 0;
virtual DatabaseMetaData * getMetaData() = 0;
virtual enum_transaction_isolation getTransactionIsolation() = 0;
virtual const SQLWarning * getWarnings() = 0;
virtual bool isClosed() = 0;
virtual bool isReadOnly() = 0;
virtual bool isValid() = 0;
virtual bool reconnect() = 0;
virtual sql::SQLString nativeSQL(const sql::SQLString& sql) = 0;
virtual PreparedStatement * prepareStatement(const sql::SQLString& sql) = 0;
virtual PreparedStatement * prepareStatement(const sql::SQLString& sql, int autoGeneratedKeys) = 0;
virtual PreparedStatement * prepareStatement(const sql::SQLString& sql, int* columnIndexes) = 0;
virtual PreparedStatement * prepareStatement(const sql::SQLString& sql, int resultSetType, int resultSetConcurrency) = 0;
virtual PreparedStatement * prepareStatement(const sql::SQLString& sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) = 0;
virtual PreparedStatement * prepareStatement(const sql::SQLString& sql, sql::SQLString columnNames[]) = 0;
virtual void releaseSavepoint(Savepoint * savepoint) = 0;
virtual void rollback() = 0;
virtual void rollback(Savepoint * savepoint) = 0;
virtual void setAutoCommit(bool autoCommit) = 0;
virtual void setCatalog(const sql::SQLString& catalog) = 0;
virtual void setSchema(const sql::SQLString& catalog) = 0;
virtual sql::Connection * setClientOption(const sql::SQLString & optionName, const void * optionValue) = 0;
virtual sql::Connection * setClientOption(const sql::SQLString & optionName, const sql::SQLString & optionValue) = 0;
virtual void setHoldability(int holdability) = 0;
virtual void setReadOnly(bool readOnly) = 0;
virtual Savepoint * setSavepoint() = 0;
virtual Savepoint * setSavepoint(const sql::SQLString& name) = 0;
virtual void setTransactionIsolation(enum_transaction_isolation level) = 0;
};
Maybe this operator:
void operator=(Connection &); , tries to tell something that I don't understand I will keep digging to understand something.
Thank you,
|
|
|
|
|
coco243 wrote: Maybe this operator: It is a simple overload of the assignment operator in C++. But is has very little to do with your question. The method you need to use is at the beginning:
virtual Connection * connect(const sql::SQLString& hostName, const sql::SQLString& userName, const sql::SQLString& password) = 0;
|
|
|
|
|
Yes, but I don't know where to find the definition of this method.
I don't find the code behind it.
|
|
|
|
|
That is the definition of the method. You just need to code it with all the parameters filled in as necessary.
|
|
|
|
|
I don't see where I am misunderstand the things but it appears to me as a declaration of a method.
For example if we have a class defined like that:
class point{
public:
int x,y;
void set (int val_x, int val_y); };
void point::set( int val_x, int val_y)
x = val_x;
y = val_y;
}
void main()
{
point p1;
p1.set(10,2);
}
In the set method I have the parameters val_x and val_y, and I see in the definition of the set method the processes that implies val_x, and val_y,
I see that val_x is attributed to x and so over, but in the connect method I don't see where hostName, userName and password are used.
That it what I want to understand.
Thank you,
|
|
|
|
|
coco243 wrote: in the connect method I don't see where hostName, userName and password are used. Why do you need to? All you really need to understand is that the C++ library will use those details to create an actual connection to the MySQL driver, and from there to the actual database server.
|
|
|
|
|
I had figured that if I know how this function is defined, I can extract more information about the conection, status of conection and other things that I am not aware, in addition I wanted to have a better overview on the subject.
modified 10-Jan-23 10:25am.
|
|
|
|