convert form byte[4] to Int32 while retaining the binary value of the byte array

Discussion in 'C++' started by jeff@foundrymusic.com, Dec 20, 2004.

  1. Guest

    how do you convert form byte[4] to Int32 while retaining the binary
    value of the byte array
    , Dec 20, 2004
    #1
    1. Advertising

  2. Re: convert form byte[4] to Int32 while retaining the binary valueof the byte array

    wrote:
    > how do you convert form byte[4] to Int32 while retaining the binary
    > value of the byte array


    First of all, you have to be a bit more specific. For example, you need
    to say that your 'byte' has only 8 bits and your Int32 is (probably) 32
    bits long. Second, what does "binary value" mean? Is your 'byte' type
    signed or unsigned? Third, what do you mean by "convert"? An array of
    four chars (signed or unsigned) cannot be _converted_ to a single int in
    C++ sense, so you probably mean "how to form a 32-bit value out of 4 8-bit
    values and retain the bit pattern of each of 4 source values?" That can
    be answered but you need to specify where your 'byte[0]' should go, to the
    beginning or to the end of the resulting integer.

    See what I mean? Perhaps while trying to understand what you need, you
    will find a decent way to "convert" what you need into what you desire
    using << and | operators...

    What are you trying to accomplish, anyway?

    V
    Victor Bazarov, Dec 20, 2004
    #2
    1. Advertising

  3. Howard Guest

    <> wrote in message
    news:...
    > how do you convert form byte[4] to Int32 while retaining the binary
    > value of the byte array
    >


    As far as I know, neither "Int32" nor "byte" are defined as types in C++. I
    can *guess* how they're defined, but it's only an eductated guess. What do
    you mean when you say you want to "retain the binary value"? And in what
    way do you want to "convert" the value?

    If what you have is an array of 4 8-bit unsigned char values, and you want
    to interpret them as a 32-bit signed long, then one way might be to use a
    pointer, like this:

    unsigned char array[4];
    //.. fill that array somehow...

    long* pInt32 = (long*)(&array[0]);

    Now, *pInt32 will be interpreted as a signed long.

    BUT!!! This may not work on your machine! For one thing, the byte ordering
    of the bytes in the array may not be correct for an integer representation
    on your machine. On a PC, the ordering of bytes is opposite what it is on
    the Mac, for example. It all depends upon you KNOWING that the values in
    that array are in the correct order in the first place.

    (On the other hand, if you know that they're in the OPPOSITE order, you can
    always copy them to another array in reverse order, and then do the above!)

    There may be other issues, possibly, such as the size of a char and a long
    on your machine, and the possibility that you could put some bit pattern
    into that array which would not be a valid 32-bit long integer.

    In general, it's best to avoid doing this if possible. But, you can try it
    and see if it works for you. Remember, though, that the solution likely
    won't be portable across machines.

    -Howard
    Howard, Dec 20, 2004
    #3
  4. Re: convert form byte[4] to Int32 while retaining the binary valueof the byte array

    Howard wrote:
    > <> wrote in message
    > news:...
    >
    >>how do you convert form byte[4] to Int32 while retaining the binary
    >>value of the byte array
    >>

    >
    > As far as I know, neither "Int32" nor "byte" are defined as types in C++. I
    > can *guess* how they're defined, but it's only an eductated guess. What do
    > you mean when you say you want to "retain the binary value"? And in what
    > way do you want to "convert" the value?
    >
    > If what you have is an array of 4 8-bit unsigned char values, and you want
    > to interpret them as a 32-bit signed long, then one way might be to use a
    > pointer, like this:


    <snip..>

    Int32 convert(Byte b[4])
    {
    return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3]);
    }

    Byte b[4] = { 1, 2, 3, 4 };

    Int32 i = convert(b);


    Let's not get _that_ picky, people.


    Jonathan
    Jonathan Mcdougall, Dec 20, 2004
    #4
  5. Re: convert form byte[4] to Int32 while retaining the binary valueof the byte array

    Jonathan Mcdougall wrote:
    > Howard wrote:
    >
    >> <> wrote in message
    >> news:...
    >>
    >>> how do you convert form byte[4] to Int32 while retaining the binary
    >>> value of the byte array
    >>>

    >>
    >> As far as I know, neither "Int32" nor "byte" are defined as types in
    >> C++. I can *guess* how they're defined, but it's only an eductated
    >> guess. What do you mean when you say you want to "retain the binary
    >> value"? And in what way do you want to "convert" the value?
    >>
    >> If what you have is an array of 4 8-bit unsigned char values, and you
    >> want to interpret them as a 32-bit signed long, then one way might be
    >> to use a pointer, like this:

    >
    >
    > <snip..>
    >
    > Int32 convert(Byte b[4])
    > {
    > return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3]);
    > }
    >
    > Byte b[4] = { 1, 2, 3, 4 };
    >
    > Int32 i = convert(b);
    >
    >
    > Let's not get _that_ picky, people.


    How did you know the OP didn't want

    return (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | (b[0]);

    ???

    V
    Victor Bazarov, Dec 20, 2004
    #5
  6. Howard Guest

    "Jonathan Mcdougall" <> wrote in message
    news:eek:0Hxd.22440$...
    > Howard wrote:
    >> <> wrote in message
    >> news:...
    >>
    >>>how do you convert form byte[4] to Int32 while retaining the binary
    >>>value of the byte array
    >>>

    >>
    >> As far as I know, neither "Int32" nor "byte" are defined as types in C++.
    >> I can *guess* how they're defined, but it's only an eductated guess.
    >> What do you mean when you say you want to "retain the binary value"? And
    >> in what way do you want to "convert" the value?
    >>
    >> If what you have is an array of 4 8-bit unsigned char values, and you
    >> want to interpret them as a 32-bit signed long, then one way might be to
    >> use a pointer, like this:

    >
    > <snip..>
    >
    > Int32 convert(Byte b[4])
    > {
    > return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3]);
    > }
    >
    > Byte b[4] = { 1, 2, 3, 4 };
    >
    > Int32 i = convert(b);
    >
    >
    > Let's not get _that_ picky, people.
    >


    How do you know that the byte ordering is correct? Maybe b[0] is the LSB!

    (And of course you're just assuming the types match. Logical assumption,
    but not explicitly stated.)

    -Howard
    Howard, Dec 20, 2004
    #6
  7. Alan Guest

    <> wrote in message news:...
    > how do you convert form byte[4] to Int32 while retaining the binary
    > value of the byte array


    Your question has nothing to do with C++.
    (hint: experiment with a union of these two types)
    Alan, Dec 20, 2004
    #7
  8. Re: convert form byte[4] to Int32 while retaining the binary valueof the byte array

    Alan wrote:
    > <> wrote in message news:...
    >
    >>how do you convert form byte[4] to Int32 while retaining the binary
    >>value of the byte array

    >
    >
    > Your question has nothing to do with C++.
    > (hint: experiment with a union of these two types)


    What's a 'union' outside of C++ context? You are contradicting yourself.
    If the OP has to look at the union, the question has _everything_ to do
    with C++.

    Besides, unions are not for conversions between types. They are only to
    save memory when storing different types. See more discussions on that
    in all known C++ newsgroups.

    V
    Victor Bazarov, Dec 20, 2004
    #8
  9. Alan Guest

    OT: convert form byte[4] to Int32 while retaining the binary value of the byte array

    "Victor Bazarov" <> wrote in message news:CfHxd.12489$09.us.to.verio.net...
    > Alan wrote:
    > > <> wrote in message news:...
    > >
    > >>how do you convert form byte[4] to Int32 while retaining the binary
    > >>value of the byte array

    > >
    > >
    > > Your question has nothing to do with C++.
    > > (hint: experiment with a union of these two types)

    >
    > What's a 'union' outside of C++ context? You are contradicting yourself.


    Hardly, they are also used in other languages (as you know), e.g. C

    > If the OP has to look at the union, the question has _everything_ to do
    > with C++.


    see above

    > Besides, unions are not for conversions between types.


    ...but they can be used for that in C
    Alan, Dec 20, 2004
    #9
  10. Howard Guest

    "Alan" <> wrote in message
    news:...
    >
    > "Victor Bazarov" <> wrote in message
    > news:CfHxd.12489$09.us.to.verio.net...
    >> Alan wrote:
    >> > <> wrote in message
    >> > news:...
    >> >
    >> >>how do you convert form byte[4] to Int32 while retaining the binary
    >> >>value of the byte array
    >> >
    >> >
    >> > Your question has nothing to do with C++.
    >> > (hint: experiment with a union of these two types)

    >>
    >> What's a 'union' outside of C++ context? You are contradicting yourself.

    >
    > Hardly, they are also used in other languages (as you know), e.g. C
    >
    >> If the OP has to look at the union, the question has _everything_ to do
    >> with C++.

    >
    > see above
    >
    >> Besides, unions are not for conversions between types.

    >
    > ..but they can be used for that in C
    >
    >


    The OP asked about doing something in C++ (assumed, since that's where he
    posted). You answered in two parts. First, you said his question had
    "nothing" to do with C++. Victor rightly asks "why?". In what way does a
    question about how to accomplish a common task not a question about how to
    accomplish that task in C++, given that that's what we discuss here? Then,
    you suggest that somehow the ability to use a union construct to accomplish
    the task should be a hint to him. We can only assume that you mean it
    should be a hint that the original question has nothing to do with C++. Yet
    the union construct does exist in C+, so in what way does it hint that the
    OP's question is not about C++? You're suggesting one way to do what he
    wants to do (albeit not a good way, IMO), with a construct that is available
    in C++, yet saying that this somehow demonstrates that the question you're
    proposing an answer to is therefore NOT related to C++. Are you as confused
    as I am yet? :)

    -Howard
    Howard, Dec 20, 2004
    #10
  11. Re: convert form byte[4] to Int32 while retaining the binary valueof the byte array

    Victor Bazarov wrote:
    > Jonathan Mcdougall wrote:
    >> Int32 convert(Byte b[4])
    >> {
    >> return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3]);
    >> }
    >>
    >> Byte b[4] = { 1, 2, 3, 4 };
    >>
    >> Int32 i = convert(b);
    >>
    >>Let's not get _that_ picky, people.

    >
    >
    > How did you know the OP didn't want
    >
    > return (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | (b[0]);


    I don't, but I think my answer (and the one you just gave) helped the OP
    quite more than "First of all, you have to be a bit more specific."

    But I may be wrong.


    Jonathan
    Jonathan Mcdougall, Dec 20, 2004
    #11
  12. Re: convert form byte[4] to Int32 while retaining the binary valueof the byte array

    Jonathan Mcdougall wrote:
    > Victor Bazarov wrote:
    >
    >> Jonathan Mcdougall wrote:
    >>
    >>> Int32 convert(Byte b[4])
    >>> {
    >>> return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3]);
    >>> }
    >>>
    >>> Byte b[4] = { 1, 2, 3, 4 };
    >>>
    >>> Int32 i = convert(b);
    >>>
    >>> Let's not get _that_ picky, people.

    >>
    >>
    >>
    >> How did you know the OP didn't want
    >>
    >> return (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | (b[0]);

    >
    >
    > I don't, but I think my answer (and the one you just gave) helped the OP
    > quite more than "First of all, you have to be a bit more specific."
    >
    > But I may be wrong.


    You may be. Only the OP can say.

    V
    Victor Bazarov, Dec 20, 2004
    #12
  13. "Alan" <> skrev i en meddelelse
    news:...
    >
    > "Victor Bazarov" <> wrote in message
    > news:CfHxd.12489$09.us.to.verio.net...
    >> Alan wrote:
    >> > <> wrote in message
    >> > news:...
    >> >
    >> >>how do you convert form byte[4] to Int32 while retaining the binary
    >> >>value of the byte array
    >> >
    >> >
    >> > Your question has nothing to do with C++.
    >> > (hint: experiment with a union of these two types)

    >>
    >> What's a 'union' outside of C++ context? You are contradicting yourself.

    >
    > Hardly, they are also used in other languages (as you know), e.g. C
    >
    >> If the OP has to look at the union, the question has _everything_ to do
    >> with C++.

    >
    > see above
    >
    >> Besides, unions are not for conversions between types.

    >
    > ..but they can be used for that in C


    But not portably in C++.
    union converter
    {
    byte b[4];
    int32 i;
    };

    ....
    converter bomb;
    bomb.b[0] = ...;
    ....
    bomb.b[3] = ...;
    int32 blow = bomb.i;

    The last statement causes undefined behaviour.

    >
    >
    Peter Koch Larsen, Dec 20, 2004
    #13
  14. "Howard" <> skrev i en meddelelse
    news:yJGxd.13993$...
    >
    > <> wrote in message
    > news:...
    >> how do you convert form byte[4] to Int32 while retaining the binary
    >> value of the byte array
    >>

    >
    > As far as I know, neither "Int32" nor "byte" are defined as types in C++.
    > I can *guess* how they're defined, but it's only an eductated guess. What
    > do you mean when you say you want to "retain the binary value"? And in
    > what way do you want to "convert" the value?
    >
    > If what you have is an array of 4 8-bit unsigned char values, and you want
    > to interpret them as a 32-bit signed long, then one way might be to use a
    > pointer, like this:
    >
    > unsigned char array[4];
    > //.. fill that array somehow...
    >
    > long* pInt32 = (long*)(&array[0]);
    >
    > Now, *pInt32 will be interpreted as a signed long.
    >
    > BUT!!! This may not work on your machine! For one thing, the byte
    > ordering of the bytes in the array may not be correct for an integer
    > representation on your machine. On a PC, the ordering of bytes is
    > opposite what it is on the Mac, for example. It all depends upon you
    > KNOWING that the values in that array are in the correct order in the
    > first place.
    >
    > (On the other hand, if you know that they're in the OPPOSITE order, you
    > can always copy them to another array in reverse order, and then do the
    > above!)
    >
    > There may be other issues, possibly, such as the size of a char and a long
    > on your machine, and the possibility that you could put some bit pattern
    > into that array which would not be a valid 32-bit long integer.
    >
    > In general, it's best to avoid doing this if possible. But, you can try
    > it and see if it works for you. Remember, though, that the solution
    > likely won't be portable across machines.
    >
    > -Howard
    >

    Also the above code gives undefined behaviour (alignment issues)

    /Peter
    Peter Koch Larsen, Dec 20, 2004
    #14
  15. Re: convert form byte[4] to Int32 while retaining the binary valueof the byte array

    wrote:

    > how do you convert form byte[4] to Int32 while retaining the binary
    > value of the byte array



    Off topic in here.


    Now if you are talking about CLI/.NET, that is you are talking about
    System::Int32 (which maps to int and long anyway), System::Byte (which
    maps to unsigned char and can also map to char), you can't cast it from
    one type to another.


    What you can do is to copy each value to a new array of the preferred type.




    --
    Ioannis Vranos

    http://www23.brinkster.com/noicys
    Ioannis Vranos, Dec 20, 2004
    #15
  16. Re: convert form byte[4] to Int32 while retaining the binary valueof the byte array

    Victor Bazarov wrote:
    > Jonathan Mcdougall wrote:
    >
    >>Victor Bazarov wrote:
    >>
    >>
    >>>Jonathan Mcdougall wrote:
    >>>
    >>>
    >>>>Int32 convert(Byte b[4])
    >>>>{
    >>>> return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3]);
    >>>>}
    >>>>
    >>>>Byte b[4] = { 1, 2, 3, 4 };
    >>>>
    >>>>Int32 i = convert(b);
    >>>>
    >>>>Let's not get _that_ picky, people.
    >>>
    >>>
    >>>
    >>>How did you know the OP didn't want
    >>>
    >>> return (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | (b[0]);

    >>
    >>
    >>I don't, but I think my answer (and the one you just gave) helped the OP
    >>quite more than "First of all, you have to be a bit more specific."
    >>
    >>But I may be wrong.

    >
    >
    > You may be. Only the OP can say.


    And he don't seem to care very much.

    By the way, I said that more as a joke, I didn't mean to offense anyone.

    Happy holidays anyways.


    Jonathan
    Jonathan Mcdougall, Dec 20, 2004
    #16
  17. EventHelix.com, Dec 21, 2004
    #17
  18. Alan Guest

    "Howard" <> wrote in message news:dYHxd.14210$...
    >
    > "Alan" <> wrote in message
    > news:...
    > >
    > > "Victor Bazarov" <> wrote in message
    > > news:CfHxd.12489$09.us.to.verio.net...
    > >> Alan wrote:
    > >> > <> wrote in message
    > >> > news:...
    > >> >
    > >> >>how do you convert form byte[4] to Int32 while retaining the binary
    > >> >>value of the byte array
    > >> >
    > >> >
    > >> > Your question has nothing to do with C++.
    > >> > (hint: experiment with a union of these two types)
    > >>
    > >> What's a 'union' outside of C++ context? You are contradicting yourself.

    > >
    > > Hardly, they are also used in other languages (as you know), e.g. C
    > >
    > >> If the OP has to look at the union, the question has _everything_ to do
    > >> with C++.

    > >
    > > see above
    > >
    > >> Besides, unions are not for conversions between types.

    > >
    > > ..but they can be used for that in C
    > >
    > >

    >
    > The OP asked about doing something in C++ (assumed, since that's where he
    > posted). You answered in two parts. First, you said his question had
    > "nothing" to do with C++. Victor rightly asks "why?". In what way does a
    > question about how to accomplish a common task not a question about how to
    > accomplish that task in C++, given that that's what we discuss here? Then,
    > you suggest that somehow the ability to use a union construct to accomplish
    > the task should be a hint to him. We can only assume that you mean it
    > should be a hint that the original question has nothing to do with C++. Yet
    > the union construct does exist in C+, so in what way does it hint that the
    > OP's question is not about C++? You're suggesting one way to do what he
    > wants to do (albeit not a good way, IMO), with a construct that is available
    > in C++, yet saying that this somehow demonstrates that the question you're
    > proposing an answer to is therefore NOT related to C++. Are you as confused
    > as I am yet? :)


    Howard, you're certainly confused but it is more the mysterious wandering
    of you mind than anything that I wrote. It's unfortunate that these personal
    attacks have apparently kept the op away, and that we'll probably never know
    what he was trying to do.

    My "hint" of using a union, was just a suggestion not a solution. He could load
    a 32-bit value into such a union and examine the byte array. Maybe it would
    tell him what he wants to know. To assume that that the op, Jeff, was seeking
    a C++ solution is an assumption on your part, as many people post here with
    questions quite unrelated to C++, as you well know.

    Jeff, just in case you're reading this, try using a union. If you wanted a solution
    in a C++ context let me apologise for the "Your question has nothing to do
    with C++."

    -Alan
    Alan, Dec 21, 2004
    #18
  19. Re: convert form byte[4] to Int32 while retaining the binary valueof the byte array

    Alan wrote:
    > My "hint" of using a union, was just a suggestion not a solution.


    That was a bad suggestion.

    > He could load
    > a 32-bit value into such a union and examine the byte array.


    That's not portable. There are other ways to do that.

    > Maybe it would
    > tell him what he wants to know. To assume that that the op, Jeff, was seeking
    > a C++ solution is an assumption on your part, as many people post here with
    > questions quite unrelated to C++, as you well know.


    The thing is, that's a c++ newsgroup. We therefore assume the language
    is C++.

    > Jeff, just in case you're reading this, try using a union.


    No! Please, read about the problems associated with this method.


    Jonathan
    Jonathan Mcdougall, Dec 21, 2004
    #19
  20. Alan Guest

    "Jonathan Mcdougall" <> wrote in message news:k9%xd.28679$...
    > Alan wrote:
    > > My "hint" of using a union, was just a suggestion not a solution.

    >
    > That was a bad suggestion.
    >
    > > He could load
    > > a 32-bit value into such a union and examine the byte array.

    >
    > That's not portable. There are other ways to do that.
    >
    > > Maybe it would
    > > tell him what he wants to know. To assume that that the op, Jeff, was seeking
    > > a C++ solution is an assumption on your part, as many people post here with
    > > questions quite unrelated to C++, as you well know.

    >
    > The thing is, that's a c++ newsgroup. We therefore assume the language
    > is C++.
    >
    > > Jeff, just in case you're reading this, try using a union.

    >
    > No! Please, read about the problems associated with this method.


    No problems here, it seems:

    #include <iostream>
    using namespace std;

    typedef unsigned char byte;
    typedef unsigned long int32;

    union converter {
    byte b[4];
    int32 i;
    };

    int main() {

    converter c;

    c.b[3] = (byte) 0x12;
    c.b[2] = (byte) 0x34;
    c.b[1] = (byte) 0x56;
    c.b[0] = (byte) 0x78;

    int32 r = c.i;
    cout << "r = 0x" << hex << r << endl;

    cout << "b = 0x" << hex << (int32)c.b[3]
    << (int32)c.b[2]
    << (int32)c.b[1]
    << (int32)c.b[0] << endl;
    return 0;
    }

    // results
    // r = 0x12345678
    // b = 0x12345678
    Alan, Dec 22, 2004
    #20
    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. =?Utf-8?B?SGlmbmkgU2hhaHphcmQ=?=

    Invalid cast from System.Int32 to System.Byte[].

    =?Utf-8?B?SGlmbmkgU2hhaHphcmQ=?=, Feb 15, 2005, in forum: ASP .Net
    Replies:
    1
    Views:
    3,772
    William F. Robertson, Jr.
    Feb 15, 2005
  2. Simon Harris
    Replies:
    2
    Views:
    2,584
    Simon Harris
    Apr 27, 2005
  3. Simon Harris
    Replies:
    0
    Views:
    731
    Simon Harris
    Apr 27, 2005
  4. Polaris431
    Replies:
    8
    Views:
    739
    SM Ryan
    Dec 4, 2006
  5. Martin DeMello

    efficient access to a large int32 array

    Martin DeMello, Jan 16, 2007, in forum: Ruby
    Replies:
    6
    Views:
    144
    Tim Pease
    Jan 16, 2007
Loading...

Share This Page