Copy 4 byte block into a char array

Discussion in 'C Programming' started by bg_ie@yahoo.com, Jun 21, 2006.

  1. Guest

    Hi,

    I have an array as follows -

    char arr[100];

    Now I wish to copy the following int -

    int tmp = 0x01020304;

    into this array, at element[12].

    This following would have the same result -

    ThePacket3[12] = 1;
    ThePacket3[13] = 2;
    ThePacket3[14] = 3;
    ThePacket3[15] = 4;

    How can I do this without breaking up my int into 4 bytes and assigning
    each element one by one?

    Thanks,

    Barry.
    , Jun 21, 2006
    #1
    1. Advertising

  2. Tom St Denis Guest

    wrote:
    > ThePacket3[12] = 1;
    > ThePacket3[13] = 2;
    > ThePacket3[14] = 3;
    > ThePacket3[15] = 4;
    >
    > How can I do this without breaking up my int into 4 bytes and assigning
    > each element one by one?


    Write a function or macro.

    It's called "modular design" where instead of copy/pasting the same
    code snippet you found on snippets.org you actually build up a program
    from a design where you abstract out common functionality to a body,
    almost a "library" if you will, of support code for your application or
    project.

    Tom
    Tom St Denis, Jun 21, 2006
    #2
    1. Advertising

  3. Nelu Guest

    writes:

    > Hi,
    >
    > I have an array as follows -
    >
    > char arr[100];
    >
    > Now I wish to copy the following int -
    >
    > int tmp = 0x01020304;
    >
    > into this array, at element[12].
    >
    > This following would have the same result -
    >
    > ThePacket3[12] = 1;
    > ThePacket3[13] = 2;
    > ThePacket3[14] = 3;
    > ThePacket3[15] = 4;
    >
    > How can I do this without breaking up my int into 4 bytes and assigning
    > each element one by one?
    >


    You could probably try this:

    memcpy(&arr[12],&tmp,sizeof(int));

    Just make sure you know exactly what you're doing. For example int
    doesn't need to be 4 byte long.

    --
    Ioan - Ciprian Tandau
    tandau _at_ freeshell _dot_ org (hope it's not too late)
    (... and that it still works...)
    Nelu, Jun 21, 2006
    #3
  4. <> wrote in message
    news:...
    > I have an array as follows -
    >
    > char arr[100];
    >
    > Now I wish to copy the following int -
    >
    > int tmp = 0x01020304;
    >
    > into this array, at element[12].
    >
    > This following would have the same result -
    >
    > ThePacket3[12] = 1;
    > ThePacket3[13] = 2;
    > ThePacket3[14] = 3;
    > ThePacket3[15] = 4;
    >
    > How can I do this without breaking up my int into 4 bytes and assigning
    > each element one by one?


    You can't, portably.

    1. The endianness of a particular machine may cause the bytes to be assigned
    to different chars than what you've listed above.
    2. element[12] may not have proper alignment for an int, causing a crash.
    3. sizeof(int) may not be 4, causing more than 4 elements of your array to
    be modified.

    This is why folks write macros (which assign the bytes in a specific order)
    for such needs.

    S

    --
    Stephen Sprunk "Stupid people surround themselves with smart
    CCIE #3723 people. Smart people surround themselves with
    K5SSS smart people who disagree with them." --Aaron Sorkin


    --
    Posted via a free Usenet account from http://www.teranews.com
    Stephen Sprunk, Jun 21, 2006
    #4
  5. James Guest

    On Wed, 21 Jun 2006 13:17:46 -0700, bg_ie wrote:
    > int tmp = 0x01020304;
    >
    > into this array, at element[12].
    >
    > This following would have the same result -
    >
    > ThePacket3[12] = 1;
    > ThePacket3[13] = 2;
    > ThePacket3[14] = 3;
    > ThePacket3[15] = 4;
    >
    > How can I do this without breaking up my int into 4 bytes and assigning
    > each element one by one?
    >


    if you know that you're on a big-endian machine and sizeof char * 4 ==
    sizeof int, you could theoretically do:

    int *slice;
    slice = &arr[12];
    *slice = tmp;

    but that's obviously unportable as hell
    James, Jun 21, 2006
    #5
  6. Tom St Denis Guest

    Stephen Sprunk wrote:
    > > How can I do this without breaking up my int into 4 bytes and assigning
    > > each element one by one?

    >
    > You can't, portably.


    ....sorta.

    In my projects I try to autodetect certain platforms and use memcpy if
    possible, otherwise yeah I extract bytes and store in order.

    Tom
    Tom St Denis, Jun 21, 2006
    #6
  7. writes:
    > I have an array as follows -
    >
    > char arr[100];
    >
    > Now I wish to copy the following int -
    >
    > int tmp = 0x01020304;
    >
    > into this array, at element[12].
    >
    > This following would have the same result -
    >
    > ThePacket3[12] = 1;
    > ThePacket3[13] = 2;
    > ThePacket3[14] = 3;
    > ThePacket3[15] = 4;
    >
    > How can I do this without breaking up my int into 4 bytes and assigning
    > each element one by one?


    int isn't necessarily 4 bytes, bytes aren't necessarily 8 bits, and
    the value 0x01020304 isn't necessarily stored in the order 1, 2, 3, 4;
    it's commonly 4, 3, 2, 1, but it could theoretically be in any of the
    24 possible orders.

    If you want to break the value of tmp down into 4 8-bit quantities,
    and store then in successive elements of your array (it it called
    "arr" or "ThePacket3"?), the only portable way to do it is by copying
    each byte individually, after extracting them using shifts and masks.

    If you're willing to make non-portable assumptions about how an int is
    represented, you can use memcpy(), but your code will break when
    ported to a system with different byte ordering.

    If you're trying to guarantee network byte ordering, there are
    functions that will handle this for you ("ntohl" and friends), but
    they're not part of standard C. If your system has them, searching
    your documentation for "ntohl" should be enough to get you started.

    --
    Keith Thompson (The_Other_Keith) <http://www.ghoti.net/~kst>
    San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
    We must do something. This is something. Therefore, we must do this.
    Keith Thompson, Jun 21, 2006
    #7
  8. On 21 Jun 2006 21:00:19 +0000, Nelu <> wrote:

    > writes:
    >
    >> Hi,
    >>
    >> I have an array as follows -
    >>
    >> char arr[100];
    >>
    >> Now I wish to copy the following int -
    >>
    >> int tmp = 0x01020304;
    >>
    >> into this array, at element[12].
    >>
    >> This following would have the same result -
    >>
    >> ThePacket3[12] = 1;
    >> ThePacket3[13] = 2;
    >> ThePacket3[14] = 3;
    >> ThePacket3[15] = 4;
    >>
    >> How can I do this without breaking up my int into 4 bytes and assigning
    >> each element one by one?
    >>

    >
    >You could probably try this:
    >
    >memcpy(&arr[12],&tmp,sizeof(int));
    >
    >Just make sure you know exactly what you're doing. For example int
    >doesn't need to be 4 byte long.


    And make sure that an int on the system is big-endian otherwise the
    result will not be as specified.


    Remove del for email
    Barry Schwarz, Jun 22, 2006
    #8
  9. On Wed, 21 Jun 2006 16:26:03 -0500, James <>
    wrote:

    >On Wed, 21 Jun 2006 13:17:46 -0700, bg_ie wrote:
    >> int tmp = 0x01020304;
    >>
    >> into this array, at element[12].
    >>
    >> This following would have the same result -
    >>
    >> ThePacket3[12] = 1;
    >> ThePacket3[13] = 2;
    >> ThePacket3[14] = 3;
    >> ThePacket3[15] = 4;
    >>
    >> How can I do this without breaking up my int into 4 bytes and assigning
    >> each element one by one?
    >>

    >
    >if you know that you're on a big-endian machine and sizeof char * 4 ==
    >sizeof int, you could theoretically do:
    >
    > int *slice;
    > slice = &arr[12];
    > *slice = tmp;


    You need a cast on the pointer assignment and the code will invoke
    undefined behavior if arr[12] is not properly aligned for an int.

    >
    >but that's obviously unportable as hell



    Remove del for email
    Barry Schwarz, Jun 22, 2006
    #9
  10. CBFalconer Guest

    wrote:
    >
    > I have an array as follows -
    >
    > char arr[100];
    >
    > Now I wish to copy the following int -
    >
    > int tmp = 0x01020304;
    >
    > into this array, at element[12].
    >
    > This following would have the same result -
    >
    > ThePacket3[12] = 1;
    > ThePacket3[13] = 2;
    > ThePacket3[14] = 3;
    > ThePacket3[15] = 4;
    >
    > How can I do this without breaking up my int into 4 bytes and assigning
    > each element one by one?


    Assuming your specs are accurate, and you change the type of tmp to
    unsigned long, you can do it independant of endianism etc. by using
    values, not bit patterns:

    unsigned char ThePacket[100];
    unsigned long tmp;
    int i;

    for (i = 3; i >= 0; i--, tmp /= 256)
    ThePacket[12 + i] = tmp % 256;

    You should be using unsigned items for both tmp and ThePacket. tmp
    must be a long to guarantee 32 bits available.

    If it can the compiler will probably optimize the modulo and
    division operations into shifts and masks. Writing portable code
    isn't all that hard, is it?

    Notice that the values 3 and 12 above can be defined as FIELDSZ and
    FIELDLOCN, or whatever nomenclature suits you.

    --
    "I don't know where bin Laden is. I have no idea and really
    don't care. It's not that important." - G.W. Bush, 2002-03-13
    "No, we've had no evidence that Saddam Hussein was involved
    with September the 11th." - George Walker Bush 2003-09-17
    CBFalconer, Jun 22, 2006
    #10
  11. wrote:
    > Hi,
    >
    > I have an array as follows -
    >
    > char arr[100];
    >
    > Now I wish to copy the following int -
    >
    > int tmp = 0x01020304;
    >
    > into this array, at element[12].
    >
    > This following would have the same result -
    >
    > ThePacket3[12] = 1;
    > ThePacket3[13] = 2;
    > ThePacket3[14] = 3;
    > ThePacket3[15] = 4;
    >
    > How can I do this without breaking up my int into 4 bytes and assigning
    > each element one by one?

    Why that requirement ?
    The obvious way is to bitshift to the right, mask
    and assign the 4(assuming that's the size of your ints) bytes in the int
    to the individual char array elements.
    =?ISO-8859-1?Q?=22Nils_O=2E_Sel=E5sdal=22?=, Jun 22, 2006
    #11
    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. Kirby
    Replies:
    3
    Views:
    637
    Kirby
    Oct 8, 2004
  2. Richard
    Replies:
    11
    Views:
    1,076
    Adam Maass
    Feb 1, 2006
  3. lovecreatesbeauty
    Replies:
    1
    Views:
    1,034
    Ian Collins
    May 9, 2006
  4. Replies:
    3
    Views:
    731
  5. VasandGVD
    Replies:
    5
    Views:
    4,631
    CBFalconer
    Nov 28, 2008
Loading...

Share This Page