int packed as hex with memcpy

Discussion in 'C++' started by Delali Dzirasa, Oct 8, 2003.

  1. 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
    Delali Dzirasa, Oct 8, 2003
    #1
    1. Advertising

  2. Delali Dzirasa

    Ron Natalie Guest

    "Delali Dzirasa" <> wrote in message news:bm1hbf$oqo$...
    > 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?
    Ron Natalie, Oct 8, 2003
    #2
    1. Advertising

  3. "Delali Dzirasa" <> wrote in message
    news:bm1hbf$oqo$...
    > 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
    Peter van Merkerk, Oct 8, 2003
    #3
  4. 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
    Andrey Tarasevich, Oct 8, 2003
    #4
  5. 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" <> wrote in message
    news:bm1l6t$hc4hv$-berlin.de...
    > "Delali Dzirasa" <> wrote in message
    > news:bm1hbf$oqo$...
    > > 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
    >
    >
    Delali Dzirasa, Oct 8, 2003
    #5
  6. Delali Dzirasa

    Howard Guest

    "Delali Dzirasa" <> wrote in message
    news:bm1hbf$oqo$...
    > 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
    Howard, Oct 8, 2003
    #6
  7. "Delali Dzirasa" <> wrote in message
    news:bm1hbf$oqo$...
    > 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)
    Jakob Bieling, Oct 8, 2003
    #7
  8. Delali Dzirasa

    Ron Natalie Guest

    "Delali Dzirasa" <> wrote in message news:bm1mhs$lic$...

    >
    > 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.
    Ron Natalie, Oct 8, 2003
    #8
  9. Delali Dzirasa

    Ron Natalie Guest

    "Delali Dzirasa" <> wrote in message news:bm1mhs$lic$...
    > 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.
    Ron Natalie, Oct 8, 2003
    #9
  10. Delali Dzirasa

    Howard Guest

    "Ron Natalie" <> wrote in message
    news:3f846fd8$0$36937$...
    >
    > "Delali Dzirasa" <> wrote in message

    news:bm1mhs$lic$...
    > > 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
    Howard, Oct 8, 2003
    #10
  11. Delali Dzirasa

    Howard Guest

    "Howard" <> wrote in message
    news:bm1mtc$...

    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
    Howard, Oct 8, 2003
    #11
  12. Delali Dzirasa

    Howard Guest

    "Ron Natalie" <> wrote in message
    news:3f846fd8$0$36937$...
    >
    > "Delali Dzirasa" <> wrote in message

    news:bm1mhs$lic$...
    > > 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
    Howard, Oct 8, 2003
    #12
  13. "Delali Dzirasa" <> wrote in message news:<bm1mhs$lic$>...
    > AddData( USHORT myVal.....)
    > {
    > //in the first case myVal is 20


    //no it isn't

    Ever heard of a debugger?

    Sam
    Samuel Barber, Oct 9, 2003
    #13
  14. 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
    Thomas Matthews, Oct 9, 2003
    #14
  15. Delali Dzirasa

    Howard Guest

    "Thomas Matthews" <> wrote in message
    news:ffghb.11843> if (temp < 10)

    > temp += 'A'; // Assumes 'A'..'F' are contiguous.


    You need to subtract 10 from that!

    -Howard
    Howard, Oct 9, 2003
    #15
  16. Delali Dzirasa

    pw4getter Guest

    "Delali Dzirasa" <> wrote in message news:<bm1hbf$oqo$>...
    > 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
    pw4getter, Oct 10, 2003
    #16
  17. > 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" <> wrote in message
    news:bm1mtc$...
    >
    > "Delali Dzirasa" <> wrote in message
    > news:bm1hbf$oqo$...
    > > 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
    >
    >
    >
    >
    >
    Delali Dzirasa, Oct 10, 2003
    #17
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    10
    Views:
    6,191
    Neredbojias
    Aug 19, 2005
  2. Schnoffos
    Replies:
    2
    Views:
    1,211
    Martien Verbruggen
    Jun 27, 2003
  3. Hal Styli
    Replies:
    14
    Views:
    1,634
    Old Wolf
    Jan 20, 2004
  4. Bengt Richter
    Replies:
    6
    Views:
    466
    Juha Autero
    Aug 19, 2003
  5. Juergen Wohnich

    memcpy a int to a char buffer ?

    Juergen Wohnich, Jan 23, 2006, in forum: C++
    Replies:
    6
    Views:
    674
    Henryk
    Jan 24, 2006
Loading...

Share This Page