|
Hello,
i ran into a bit of trouble when converting unsigned short int to its hex string representation. What i need is a two byte representation with a space between the bytes (e.g "0f 43" for 3907 of "00 ff" for 255)
The solution i came up with is the following:
unsigned char* CreateHexValues(unsigned short int inValue)
{
char Hex[5] = {0, 0, 0, 0, 0};
_itoa_s(inValue, Hex, 16);
unsigned char *hexOut = new unsigned char[5];
hexOut[2] = ' ';
if(inValue <= 15)
{
hexOut[0] = '0';
hexOut[1] = '0';
hexOut[3] = '0';
hexOut[4] = Hex[0];
}
else if(inValue > 15 && inValue <= 255)
{
hexOut[0] = '0';
hexOut[1] = '0';
hexOut[3] = Hex[0];
hexOut[4] = Hex[1];
}
else if(inValue > 255 && inValue <= 4095)
{
hexOut[0] = '0';
hexOut[1] = Hex[0];
hexOut[3] = Hex[1];
hexOut[4] = Hex[2];
}
else if (inValue > 4096)
{
hexOut[0] = Hex[0];
hexOut[1] = Hex[1];
hexOut[3] = Hex[2];
hexOut[4] = Hex[3];
}
return hexOut;
}
So my question is: is there a better/quicker way to do that? The problem is that when i convert it with _itoa_s it could be in the following formats: f43, 43, 3 (depending on inValue) without any zeros in front of it. Another problem is with the Hex[5] array, my inValue can never be bigger than 65535, but for some reason i get an assertion failure when i change its size to Hex[4] which should be enough for 65535. Why could that be?
Thanks for all replies in advance
|
|
|
|
|
A simpler way is to use the one of the xprintf() type functions. Take a look here[^] at the x and X format specifiers.
|
|
|
|
|
I would do
void CreateHexValues(unsigned short inValue, char hexOut[6])
{
sprintf(hexOut, "%02x %02x", (inValue >> 8), (inValue & 0xFF) );
}
Please note: Array allocation is, by design... , responsibility of the caller.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
modified on Tuesday, November 3, 2009 9:27 AM
|
|
|
|
|
CPallini wrote: void CreateHexValues(unsigned short inValue, char hexOut[5])
Shouldn't it be hexOut[6] to make room for the \0 character?
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"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
|
|
|
|
|
Definitely!
Fixed: thank you!
BTW: Shhhhhhhhhhhhhhhhhhhhh, don't tell Rajesh!
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Thank you very much, brilliant solution 
|
|
|
|
|
How about something like:
char szBuffer[10];
short value = 1234;
sprintf(szBuffer, "%02X %02X", HIBYTE(value), LOBYTE(value));
Tony
|
|
|
|
|
hey there tell me how to communicate with the printer ... Give me a sample code
|
|
|
|
|
I don't know if you understand but your question is rather.... hum no question at all. its actually an order... a very lazy one
Why don't you try Google it!!! Its much easier and faster than waiting an answer here. Don't you think that no-one so far needed to communicate with a printer from C++? I doubt it.
here is what i found in 1 min....
http://www.mombu.com/programming/cobol/t-writing-to-printer-from-c-program-761884.html
Regards
Nikola
|
|
|
|
|
anilga wrote: hey there tell me how to communicate with the printer
hey there read the guidelines[^].
anilga wrote: Give me a sample code
printf("I am too lazy to do my own research\n");
|
|
|
|
|
What about documentation [^]?
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
anilga wrote: hey there tell me how to communicate with the printer
Try soothing words. If that doesn't work, use harsh language.
|
|
|
|
|
anilga wrote: hey there tell me how to communicate with the printer ... Give me a sample code
fprintf(stdprn, "Hi\n");
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"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
|
|
|
|
|
Hi,
Nobody will want to do your work. So, search the internet, do some research and reach a stage where you'd have specific issues. You could then come here for help.
Until then,
UINT SendToPrinter(LPVOID pData){
}
“Follow your bliss.” – Joseph Campbell
|
|
|
|
|
Do you want to write driver for printer or you want to print some things with it?
Of one Essence is the human race
thus has Creation put the base
One Limb impacted is sufficient
For all Others to feel the Mace
(Saadi )
|
|
|
|
|
Hi Hamid! How do you do? It's a quite long time since I've seen your last post here...
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Hi Pallini
how are you?yeah I was not here for long time,I was busy and I didnt have free time for here,well how are your days? whats up of your THHB? btw I dont have your mail could you send it for me?
Of one Essence is the human race
thus has Creation put the base
One Limb impacted is sufficient
For all Others to feel the Mace
(Saadi )
|
|
|
|
|
HI all,
i want to add all files of a folder ,but there is a requirement the selected folder not have any other folder only filese are must be present.
so please tell me How can add path of all files to List Ctrl those are present in folder ?
thanks in advance.
To accomplish great things, we must not only act, but also dream;
not only plan, but also believe.
|
|
|
|
|
Try using the FindFirstFile[^] and FindNextFile[^] APIs for this task. You can add the file names once you got them using CListCtrl::InsertItem[^]. Good luck.
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Sometimes you just have to hate coding to do it well. <
|
|
|
|
|
When browse for folder use, i want the ok button enable only when the folder haven't any other sub folder.
so please tell me how can i do this.
|
|
|
|
|
iwt.dev wrote: ...i want the ok button enable...
Use EnableWindow() for this.
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"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
|
|
|
|
|
Specifically which part is troubling you? Hint: "All of it" is not an acceptable answer.
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"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
|
|
|
|
|
Ok so I want to learn what is the problem in the following code:
typedef int (*foo_ptr)(void);
static int foo()
{
return 20;
}
static void after_foo(){}
void main(int argc, char **argv)
{
size_t foo_size = (LPBYTE)after_foo - (LPBYTE)foo;
foo_ptr p_foo = (foo_ptr) VirtualAlloc(0, foo_size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
CopyMemory(p_foo, &foo, foo_size);
int res = (*p_foo)();
}
Now it works perfectly as this but it crashes as soon as i insert printf("something") in the foo function. so the code that fails is the following:
typedef int (*foo_ptr)(void);
static int foo()
{
// this is the only modification
printf("test to print");
return 20;
}
static void after_foo(){}
void main(int argc, char **argv)
{
size_t foo_size = (LPBYTE)after_foo - (LPBYTE)foo;
foo_ptr p_foo = (foo_ptr) VirtualAlloc(0, foo_size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
CopyMemory(p_foo, &foo, foo_size);
int res = (*p_foo)();
}
What i have noticed is that it crushes each time i insert a code that access the heap memory in the foo function. If i insert a code that allocates a heap it is not a problem (example int x;). I think it is something with the static functions and their address translation (absolute vs relative)...
Any answer would be appreciated
P.S. Please note that i do not want to do some mallware code.. i mean i know how to inject the code in the address space of another process i just cant figure it out how to insert it in the address space of the same process...... I have done a data management component which i use to share data between processes (IPC). The data management component works on a File mapped memory and uses custom heap implementation over that memory (using offsets since the memory is mapped differently in each process) to store the data. Now i want to boost it to share not only data between processes but also a code. The idea is that i do not want to inject the code from another process instead to inject the code in a shared memory space then from another process to copy the function in the local memory space and execute it from there.
Example:
App1 -> store foo() in DM
App2 -> read foo() from DM
App2 -> write foo() in local memory space (with PAGE_EXECUTE_READWRITE protection flag set)
App2 -> execute foo()
* DM is already created and works fine with data
* I understand that foo must not call functions from libraries that are not loaded in App2
Uffff tooo long post... sorry
regards,
Nikola Tanev
|
|
|
|
|
Ok so i found the solution:
I Execute the code in Release mode.
In this current case the problem was the _RTC_CheckEsp that checks checks the validity of the ESP register. It works ok for the original function (call _RTC_CheckEsp) but for the copied it was a jump to an address containing invalid memory (call 00030090 and on that address was nothing (no mans land) except 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00). I guess the call to _RTC_CheckEsp is actually a call to a relative address and it gets lost when the code is copied in another memory location.
_RTC_CheckEsp
00041120 jne esperror (41123h)
00041122 ret
It seams that this function works only in debug mode. What it does is that it checks the ESP register (stack register) and if corrupted jumps to 41123h (esperror)
I thought i give the solution here and my opinion for the solution in case anyone else has a similar problem
P.S. It is an interesting subject so if anyone has an idea (or if i am wrong) i would be more than happy to hear it... (maybe even write an article about it)
regards
Nikola
|
|
|
|
|
I kinda glossed over the fact that there was an empty function in your code, after_foo. Until it hit me - of course! I bet he's using this as a label, in order to retrieve the size of the function that's being copied from 1 part of memory to another.
Sure enough, yup!
I used to do this kind of thing all the time (in 16bit assembler ) , though I recall reading a discussion on exactly this practise just a few weeks/months ago. The basic gist of the discussion was that this was a very dodgy way of determining the size of the code bytes of a particular function.
I can't remeber if it had to do with alignment to 2/4/8/16/32 byte boundaries, or if was skuttled by the compiler's optimization techniques. In any case, I plugged your code into my ide without the memory copying - i.e just calling the function from in place - It ran and printed a result, though I'm too tired to find a debugger right-now.
#include <windows.h>
typedef int (*foo_ptr)(void);
static int foo()
{
printf("Inside foo\n");
return 20;
}
static void after_foo(){}
void main(int argc, char **argv)
{
size_t foo_size = (LPBYTE)after_foo - (LPBYTE)foo;
foo_ptr p_foo = &foo;
int res = (*p_foo)();
printf("Result was: %d\n", res);
printf("Size was: %d\n", foo_size);
}
|
|
|
|