473,395 Members | 1,495 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,395 software developers and data experts.

int packed as hex with memcpy

I would have a number packed with its hex representation of the integer
below is some sample code of what is being done.

int value = 20; //in hex it is 0x14

AddData (value);
..
..
..

AddData( USHORT myVal.....)
{
UCHAR tmp2[2];
tmp2[1] = myVal & 0x00FF;
tmp2[0] = (myVal & 0xFF00) >> 8 ;

memcpy(&myPkt[0], &tmp2, 2); // (where myPkt is a UCHAR*
}

when I check the hex dump I see that 0x0020 was packed instead of the 0x0014
that I want. How can I set the proper flags(?) "if" that is the solution to
pack the hex representation of the integer?
Thanks, your help is greatly appreciated!
Delali
Jul 19 '05 #1
16 7623

"Delali Dzirasa" <De************@jhuapl.edu> wrote in message news:bm**********@houston.jhuapl.edu...
I would have a number packed with its hex representation of the integer
below is some sample code of what is being done.

int value = 20; //in hex it is 0x14 AddData( USHORT myVal.....)
{
UCHAR tmp2[2]; presumably UCHAR is unsigned char? tmp2[1] = myVal & 0x00FF;
tmp2[0] = (myVal & 0xFF00) >> 8 ;

memcpy(&myPkt[0], &tmp2, 2); // (where myPkt is a UCHAR* memcpy(myPkt, tmp2, sizeof tmp2);
when I check the hex dump I see that 0x0020 was packed instead of the 0x0014
that I want. How can I set the proper flags(?) "if" that is the solution to
pack the hex representation of the integer?


There are no flags and there's no such thing as a hex representation in the code.
The above have stored the value which is both 20 decimal and 14 hex and 24 octal
etc...tmp2[1]. What makes you think otherwise? Are you sure your dumper is really
showing you the bytes in hex?
Jul 19 '05 #2
"Delali Dzirasa" <De************@jhuapl.edu> wrote in message
news:bm**********@houston.jhuapl.edu...
I would have a number packed with its hex representation of the integer
below is some sample code of what is being done.

int value = 20; file://in hex it is 0x14

AddData (value);
.
.
.

AddData( USHORT myVal.....)
{
UCHAR tmp2[2];
tmp2[1] = myVal & 0x00FF;
tmp2[0] = (myVal & 0xFF00) >> 8 ;

memcpy(&myPkt[0], &tmp2, 2); // (where myPkt is a UCHAR*
}

when I check the hex dump I see that 0x0020 was packed instead of the 0x0014 that I want. How can I set the proper flags(?) "if" that is the solution to pack the hex representation of the integer?


The code you posted is unfortunately not compilable since AddData() does not
have a return type, and UCHAR and USHORT are not defined in the C++
standard. That being said, I see nothing in your code that would explain the
values in your hex dump. Are you sure that the tool you are using is
displaying the data in hexadecimal format and not decimal format?

--
Peter van Merkerk
peter.van.merkerk(at)dse.nl
Jul 19 '05 #3
Delali Dzirasa wrote:
I would have a number packed with its hex representation of the integer
below is some sample code of what is being done.
You should probably start by explaining what you understand under "hex
representation of the integer" and under "packing a number with its hex
representation" in this particular case. "Hex representation" is in
essence a sequence of characters from '0'..'9', 'A'..'F' set or
something like this. I don't see anything in your code that has anything
to do with obtaining a hex representation of any number, let alone the
"packing".
int value = 20; //in hex it is 0x14

AddData (value);
.
.
.

AddData( USHORT myVal.....)
{
UCHAR tmp2[2];
tmp2[1] = myVal & 0x00FF;
tmp2[0] = (myVal & 0xFF00) >> 8 ;

memcpy(&myPkt[0], &tmp2, 2); // (where myPkt is a UCHAR*
}

when I check the hex dump I see that 0x0020 was packed instead of the 0x0014
that I want. How can I set the proper flags(?) "if" that is the solution to
pack the hex representation of the integer?


--
Best regards,
Andrey Tarasevich
Brainbench C and C++ Programming MVP

Jul 19 '05 #4
Yes they are sent to a file via another program that I am testing, this
program is acting like a simulator and the other application sits and waits
for data then displays them in log files as to what was sent, so I am not
entirely sure how they are bring printed. I read the log files by opening
then as a binary file and viewing the content. here is a bit of
clarification as to what is happening.

AddData( USHORT myVal.....)
{
//in the first case myVal is 20

UCHAR tmp2[2]; //yes unsigned char
tmp2[1] = myVal & 0x00FF;
tmp2[0] = (myVal & 0xFF00) >> 8 ;
memcpy(&myPkt[0], &tmp2, 2); // (where myPkt is a UCHAR*

myVal = 0x1500;
tmp2[1] = myVal & 0x00FF;
tmp2[0] = (myVal & 0xFF00) >> 8 ;
memcpy(&myPkt[2], &tmp2, 2); // (where myPkt is a UCHAR*

myVal = 0x0430;
tmp2[1] = myVal & 0x00FF;
tmp2[0] = (myVal & 0xFF00) >> 8 ;
memcpy(&myPkt[4], &tmp2, 2); // (where myPkt is a UCHAR*
}
in the binary file I see : 00 20 15 00 04 30

when I need to be seeing: 00 14 15 00 04 30
When I explicitly assign myVal a hex value (0x.......) it works fine.....but
when it is represented in decimal it pack the that decimal as if it were the
original hex value ( ie 0020, and not 0014);


I hope this is a little more clear

Delali

also when I try to change the code: memcpy(&myPkt[2], &tmp2, 2);
as suggested to: memcpy(myPkt[2], tmp2, 2);" I get the following error

"error C2664: 'memcpy' : cannot convert parameter 1 from 'unsigned char' to
'void *'"

"Peter van Merkerk" <me*****@deadspam.com> wrote in message
news:bm************@ID-133164.news.uni-berlin.de...
"Delali Dzirasa" <De************@jhuapl.edu> wrote in message
news:bm**********@houston.jhuapl.edu...
I would have a number packed with its hex representation of the integer
below is some sample code of what is being done.

int value = 20; file://in hex it is 0x14

AddData (value);
.
.
.

AddData( USHORT myVal.....)
{
UCHAR tmp2[2];
tmp2[1] = myVal & 0x00FF;
tmp2[0] = (myVal & 0xFF00) >> 8 ;

memcpy(&myPkt[0], &tmp2, 2); // (where myPkt is a UCHAR*
}

when I check the hex dump I see that 0x0020 was packed instead of the 0x0014
that I want. How can I set the proper flags(?) "if" that is the

solution to
pack the hex representation of the integer?
The code you posted is unfortunately not compilable since AddData() does

not have a return type, and UCHAR and USHORT are not defined in the C++
standard. That being said, I see nothing in your code that would explain the values in your hex dump. Are you sure that the tool you are using is
displaying the data in hexadecimal format and not decimal format?

--
Peter van Merkerk
peter.van.merkerk(at)dse.nl

Jul 19 '05 #5

"Delali Dzirasa" <De************@jhuapl.edu> wrote in message
news:bm**********@houston.jhuapl.edu...
I would have a number packed with its hex representation of the integer
below is some sample code of what is being done.

int value = 20; //in hex it is 0x14

AddData (value);
.
.
.

AddData( USHORT myVal.....)
{
UCHAR tmp2[2];
tmp2[1] = myVal & 0x00FF;
Suppose you pass in the decimal value 20. That's 0x14 in hex. The above
line masks off the high word (of a character, which is smaller!), so that
you are doing 0x0014 & 0x00ff, which results in 0x0014. Stored in an
unsigned char, that is 0x14, which is just what you started with: decimal
20!
tmp2[0] = (myVal & 0xFF00) >> 8 ;
Here, you have (0x0014 & 0xff00)>>8, which results in (0x0000) >> 8, which
is 0x0000, or simply decimal 0 (zero). So, your two unsigned chars stored
in tmp2 are 0 and 20.

memcpy(&myPkt[0], &tmp2, 2); // (where myPkt is a UCHAR*
}

when I check the hex dump I see that 0x0020 was packed instead of the 0x0014 that I want. How can I set the proper flags(?) "if" that is the solution to pack the hex representation of the integer?


I think your "hex dump" is not hex at all, but decimal, showing the first
byte as zero, and the second as 20, just like your code told it to do.

I'm not sure why you want to take an unsigned short and store it in two
unsigned characters, but that's hardly "packing", which implies reducing the
space required. What do you need in the output? Characters representing
the hex digits such as ['0','0','1','4']? A pair of unsigned char values,
one for each hex digit, such as [0,0,1,4]? Or do you really need to do this
"packng" at all? I mean, a hex dump of the original decinal value 20 will
show you 0x0014 just like you've been trying to get in the first place.

If you're trying to get the hex digits as separate values, such as
[0,0,1,4], remember that you've got 4 bytes in a short, not 2, and will need
an array of 4 unsigned char's to handle all possible unsigned short values.
And, your masks should mask off one byte at a time, not two like 0x00ff and
0xff00 do.

-Howard

Jul 19 '05 #6
"Delali Dzirasa" <De************@jhuapl.edu> wrote in message
news:bm**********@houston.jhuapl.edu...
I would have a number packed with its hex representation of the integer
below is some sample code of what is being done.

I do not really understand what you are trying to do. But I think that
you think that an integer can hold a number in decimal representation and
*in addition* in a, as you say, packed hexadecimal representation. That is
not the case. Assign 20 to an int and you will get the *exact* same bit
pattern when assigning 0x14 to it (which is 00010100 in both cases).

In another post you said that if you use the hexadecimal representation,
it works fine. I do not want to call you a liar, but whether you pass '20'
or '0x14' is completely irrelevant and will produce the *exact* same code.
It might be a good idea to post a new *minimal*, compilable code sample,
which people just have to paste into an new cpp file and compile.

hth
--
jb

(replace y with x if you want to reply by e-mail)
Jul 19 '05 #7

"Delali Dzirasa" <De************@jhuapl.edu> wrote in message news:bm**********@houston.jhuapl.edu...

also when I try to change the code: memcpy(&myPkt[2], &tmp2, 2);
as suggested to: memcpy(myPkt[2], tmp2, 2);" I get the following error


I didn't suggest that.

Jul 19 '05 #8

"Delali Dzirasa" <De************@jhuapl.edu> wrote in message news:bm**********@houston.jhuapl.edu...
Yes they are sent to a file via another program that I am testing,


Make a complete version of a program that demonstrates the problem AND compiles.
You keep giving us fragments, which look like they ought to be fine. We're not
clairvoyant. The fault is almost certianly in the creation of the value you pass
to AddData.
Jul 19 '05 #9

"Ron Natalie" <ro*@sensor.com> wrote in message
news:3f***********************@news.newshosting.co m...

"Delali Dzirasa" <De************@jhuapl.edu> wrote in message news:bm**********@houston.jhuapl.edu...
Yes they are sent to a file via another program that I am testing,


Make a complete version of a program that demonstrates the problem AND

compiles. You keep giving us fragments, which look like they ought to be fine. We're not clairvoyant. The fault is almost certianly in the creation of the value you pass to AddData.


I think the fault is actually with the fact the OP is masking off the
high/low words but trying to get bytes:

tmp2[1] = myVal & 0x00FF;
tmp2[0] = (myVal & 0xFF00) >> 8 ;
-Howard
Jul 19 '05 #10

"Howard" <al*****@hotmail.com> wrote in message
news:bm********@dispatch.concentric.net...

A correction is in order: I got so confused by the original post, I got my
own bytes and words mixed up. The mask is wrong, as I stated, but whereever
I said "byte" I should have said "nibble", and where I said "word" I should
have said "byte". The problem still is in the mask, in that to get the
first (low-order) hex digit (nibble), you need:

y = x & 0x000f;

not

y = x & 0x00ff;

-Howard
Jul 19 '05 #11

"Ron Natalie" <ro*@sensor.com> wrote in message
news:3f***********************@news.newshosting.co m...

"Delali Dzirasa" <De************@jhuapl.edu> wrote in message news:bm**********@houston.jhuapl.edu...
Yes they are sent to a file via another program that I am testing,


Make a complete version of a program that demonstrates the problem AND

compiles. You keep giving us fragments, which look like they ought to be fine. We're not clairvoyant. The fault is almost certianly in the creation of the value you pass to AddData.

I think the fault is actually with the fact the OP is masking off the
high/low bytes but trying to get the hex digits, which would be "nibbles":

This:
tmp2[1] = myVal & 0x00FF;

should be:
tmp2[3] = myVal & 0x000f;

(and there should be four unsigned char's to handle the four hex digits
properly, not two.)

-Howard
Jul 19 '05 #12
"Delali Dzirasa" <De************@jhuapl.edu> wrote in message news:<bm**********@houston.jhuapl.edu>...
AddData( USHORT myVal.....)
{
//in the first case myVal is 20


//no it isn't

Ever heard of a debugger?

Sam
Jul 19 '05 #13
Delali Dzirasa wrote:
I would have a number packed with its hex representation of the integer
below is some sample code of what is being done.

int value = 20; //in hex it is 0x14

AddData (value);
.
.
.

AddData( USHORT myVal.....)
{
UCHAR tmp2[2];
tmp2[1] = myVal & 0x00FF;
tmp2[0] = (myVal & 0xFF00) >> 8 ;

memcpy(&myPkt[0], &tmp2, 2); // (where myPkt is a UCHAR*
}

when I check the hex dump I see that 0x0020 was packed instead of the 0x0014
that I want. How can I set the proper flags(?) "if" that is the solution to
pack the hex representation of the integer?
Thanks, your help is greatly appreciated!
Delali


Try this sequence:
char temp;
std::list<char> ascii_num;
unsigned int value = 0x14; // 20 in decimal.
temp = static_cast<char>(value & 0x0F); // keep Least Significant
// Hex digit. [1]
if (temp < 10)
temp += '0'; // Assumes '0'..'9' are contiguous.
else
temp += 'A'; // Assumes 'A'..'F' are contiguous.
ascii_num.push_front(temp);
value = value >> 4; // 4 bits per hex digit.

Notes:
[1] a 'char' type may be unsigned or signed. However, it is
guaranteed to be at least 8 bits in size. Only 4 bits are needed
from the original value, which should fit in either a signed
or unsigned char.

--
Thomas Matthews

C++ newsgroup welcome message:
http://www.slack.net/~shiva/welcome.txt
C++ Faq: http://www.parashift.com/c++-faq-lite
C Faq: http://www.eskimo.com/~scs/c-faq/top.html
alt.comp.lang.learn.c-c++ faq:
http://www.raos.demon.uk/acllc-c++/faq.html
Other sites:
http://www.josuttis.com -- C++ STL Library book

Jul 19 '05 #14

"Thomas Matthews" <Th**********************@sbcglobal.net> wrote in message
news:ffghb.11843> if (temp < 10)
temp += 'A'; // Assumes 'A'..'F' are contiguous.


You need to subtract 10 from that!

-Howard
Jul 19 '05 #15
"Delali Dzirasa" <De************@jhuapl.edu> wrote in message news:<bm**********@houston.jhuapl.edu>...
I would have a number packed with its hex representation of the integer
below is some sample code of what is being done.

int value = 20; //in hex it is 0x14

AddData (value);
.
.
.

AddData( USHORT myVal.....)
{
UCHAR tmp2[2];
tmp2[1] = myVal & 0x00FF;
tmp2[0] = (myVal & 0xFF00) >> 8 ;

memcpy(&myPkt[0], &tmp2, 2); // (where myPkt is a UCHAR* You are taking an address of a variable (which happened to be on
stack and copying it into your Ptk (whatever it is) All of it has
nothing to do with a
black magick you're doing two lines above. The value in <your>Ptk is
an arbitrary number.
The black magic with bytes yelds an unsigned short equal to zero.

If You really wanrt to see what inside of yur temp2 array you should
do
memcpy(&myPtk[0],&temp2[0],sizeof temp2);
// ^ and ^ is a difference. }

when I check the hex dump I see that 0x0020 was packed instead of the 0x0014
that I want. How can I set the proper flags(?) "if" that is the solution to
pack the hex representation of the integer?
Thanks, your help is greatly appreciated!
Delali

Jul 19 '05 #16
> If you're trying to get the hex digits as separate values, such as
[0,0,1,4], remember that you've got 4 bytes in a short, not 2, and will need an array of 4 unsigned char's to handle all possible unsigned short values. And, your masks should mask off one byte at a time, not two like 0x00ff and 0xff00 do.
thanks this explanation did the trick......either an array of 4 unsigned
char's or an array of 2 unsigned shorts worked!

Thanks!
Delali
"Howard" <al*****@hotmail.com> wrote in message
news:bm********@dispatch.concentric.net...
"Delali Dzirasa" <De************@jhuapl.edu> wrote in message
news:bm**********@houston.jhuapl.edu...
I would have a number packed with its hex representation of the integer
below is some sample code of what is being done.

int value = 20; //in hex it is 0x14

AddData (value);
.
.
.

AddData( USHORT myVal.....)
{
UCHAR tmp2[2];
tmp2[1] = myVal & 0x00FF;
Suppose you pass in the decimal value 20. That's 0x14 in hex. The above
line masks off the high word (of a character, which is smaller!), so that
you are doing 0x0014 & 0x00ff, which results in 0x0014. Stored in an
unsigned char, that is 0x14, which is just what you started with: decimal
20!
tmp2[0] = (myVal & 0xFF00) >> 8 ;


Here, you have (0x0014 & 0xff00)>>8, which results in (0x0000) >> 8, which
is 0x0000, or simply decimal 0 (zero). So, your two unsigned chars stored
in tmp2 are 0 and 20.

memcpy(&myPkt[0], &tmp2, 2); // (where myPkt is a UCHAR*
}

when I check the hex dump I see that 0x0020 was packed instead of the

0x0014
that I want. How can I set the proper flags(?) "if" that is the

solution to
pack the hex representation of the integer?

I think your "hex dump" is not hex at all, but decimal, showing the first
byte as zero, and the second as 20, just like your code told it to do.

I'm not sure why you want to take an unsigned short and store it in two
unsigned characters, but that's hardly "packing", which implies reducing

the space required. What do you need in the output? Characters representing
the hex digits such as ['0','0','1','4']? A pair of unsigned char values,
one for each hex digit, such as [0,0,1,4]? Or do you really need to do this "packng" at all? I mean, a hex dump of the original decinal value 20 will
show you 0x0014 just like you've been trying to get in the first place.

If you're trying to get the hex digits as separate values, such as
[0,0,1,4], remember that you've got 4 bytes in a short, not 2, and will need an array of 4 unsigned char's to handle all possible unsigned short values. And, your masks should mask off one byte at a time, not two like 0x00ff and 0xff00 do.

-Howard


Jul 19 '05 #17

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

6
by: myhotline | last post by:
hi all im very confused about using memcpy and i have three questions....memcpy takes a pointer to src and a pointer to dest and copies src to destination...but im very confuzed about when to...
56
by: ccwork | last post by:
Hi all, Here is a sample code segment: .... typedef PACKED struct { union { PACKED struct { char red:1;
3
by: Amaryllis | last post by:
Hi again, I'm new to the world of communicating between VB.NET and AS/400, so I've been posting a lot of questions lately since no one else in the company has done anything like this before. ...
3
by: Brian Henry | last post by:
Does anyone know of or know how to convert a COBOL packed decimal in a text file to a decimal that .NET can work with? we are importing Old COBOL data files that have packed data in them and need...
3
by: parag.kanade | last post by:
I have a packet structure which has a field of Integer arrays, that is packed struct { int a; char b; int count; }foo; I need to initialize all the entries of count to a particular value,
6
by: Juergen Wohnich | last post by:
Hello, i want to do store int variablen into a char Buffer. Like this: char Buffer; int b = 1447; int *pb; // pb deklariert als pointer auf int pb = &b; // & ist Adress operator, liefert...
4
by: Spufi | last post by:
I have read several messages on converting packed decimals (EBCDIC) in a C++ program, but they were all for AS400 systems. I am looking for a way to convert the packed decimals in a COBOL program...
15
by: Daniel Rudy | last post by:
What is the difference between packed and unpacked structs? -- Daniel Rudy Email address has been base64 encoded to reduce spam Decode email address using b64decode or uudecode -m Why...
9
by: Sikandar | last post by:
Hi, I am beginner in C. Pls let me know what is packed array in C. Where is it used? Thanks, Sikandar
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.