Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. working with byte arrays

working with byte arrays

Scheduled Pinned Locked Moved C / C++ / MFC
data-structurestutorialquestion
29 Posts 7 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Lost User

    assuming this is the format of all messages that you need to process, it looks like the message format is :

    Addr Content
    0 05
    1 0084 (as bytes 8400)
    3 "ServerName;DELLC521-01;InstanceName;SQLEXPRESS;IsClustered;No;Version;10.50.1600.1;;"

    Byte zero contains some flag or identifier (no idea what)
    Bytes 1 & 2 contain a 16-bit integer giving the length of the following data
    Bytes 3 - n contain the message data, which in this case is a semi-colon delimited string.

    So given the above information your message processor can copy the characters (using the length information) into a proper null-terminated string buffer. That string may then be split into tokens and each required value can be found by comparing the keywords with known tokens. Something like:

    int msgLength = buffer[2] << 8 + buffer[1];
    char* szWords = new char[msgLength + 1];
    strncpy(szWords, buffer + 3, msgLength);
    // remainder of code left as an exercise for the reader
    // use strtok() to extract each token
    // strcmp() to look for keywords
    //
    // alternatively use std::string to parse and extract

    Unrequited desire is character building. OriginalGriff I'm sitting here giving you a standing ovation - Len Goodman

    J Offline
    J Offline
    jkirkerx
    wrote on last edited by
    #16

    Give me an hour to digest the knowledge you presented, looks very helpful and promising. perhaps in words, get the message length the packet declared make a new byte array copy the message only to the new byte array, leaving the packet header behind then pass the message to the function, and extract the ; delimited data.

    1 Reply Last reply
    0
    • L Lost User

      assuming this is the format of all messages that you need to process, it looks like the message format is :

      Addr Content
      0 05
      1 0084 (as bytes 8400)
      3 "ServerName;DELLC521-01;InstanceName;SQLEXPRESS;IsClustered;No;Version;10.50.1600.1;;"

      Byte zero contains some flag or identifier (no idea what)
      Bytes 1 & 2 contain a 16-bit integer giving the length of the following data
      Bytes 3 - n contain the message data, which in this case is a semi-colon delimited string.

      So given the above information your message processor can copy the characters (using the length information) into a proper null-terminated string buffer. That string may then be split into tokens and each required value can be found by comparing the keywords with known tokens. Something like:

      int msgLength = buffer[2] << 8 + buffer[1];
      char* szWords = new char[msgLength + 1];
      strncpy(szWords, buffer + 3, msgLength);
      // remainder of code left as an exercise for the reader
      // use strtok() to extract each token
      // strcmp() to look for keywords
      //
      // alternatively use std::string to parse and extract

      Unrequited desire is character building. OriginalGriff I'm sitting here giving you a standing ovation - Len Goodman

      J Offline
      J Offline
      jkirkerx
      wrote on last edited by
      #17

      Didn't work at first, then I hardcoded the message length just for testing, and everything worked, including passing the string to the function. I need to figure out the length calculation. Working on that now, almost there, wow

      int msgLength = 80;
      char* szWords = new char[msgLength + 1];
      strncpy(szWords, recvbuf + 3, msgLength);

      This is the szWords,

      szWords 0x003e8f10 "ServerName;DELLC521-01;InstanceName;SQLEXPRESS;IsClustered;No;Version;10.50.1600Íýýýý««««««««þîþ"

      L 1 Reply Last reply
      0
      • A App_

        is done like this:

        #include <iostream>
        using namespace std;

        void charray(char test[]) {
        strncpy(test,"test",sizeof(test));
        }

        int main() {
        char test[256]={' '};
        charray(test);
        printf("Text in %s!\n", test);
        return 0;
        }

        L Offline
        L Offline
        Lost User
        wrote on last edited by
        #18

        You cannot use sizeof() in the function above, because the array size is not known at that point.

        Unrequited desire is character building. OriginalGriff I'm sitting here giving you a standing ovation - Len Goodman

        1 Reply Last reply
        0
        • J jkirkerx

          Didn't work at first, then I hardcoded the message length just for testing, and everything worked, including passing the string to the function. I need to figure out the length calculation. Working on that now, almost there, wow

          int msgLength = 80;
          char* szWords = new char[msgLength + 1];
          strncpy(szWords, recvbuf + 3, msgLength);

          This is the szWords,

          szWords 0x003e8f10 "ServerName;DELLC521-01;InstanceName;SQLEXPRESS;IsClustered;No;Version;10.50.1600Íýýýý««««««««þîþ"

          L Offline
          L Offline
          Lost User
          wrote on last edited by
          #19

          jkirkerx wrote:

          I need to figure out the length calculation.

          I gave you the code for that in my previous message; and I missed a line of code, so it should read:

          int msgLength = buffer[2] << 8 + buffer[1];
          char* szWords = new char[msgLength + 1];
          strncpy(szWords, buffer + 3, msgLength);
          szWords[msgLength] = '\0';

          Unrequited desire is character building. OriginalGriff I'm sitting here giving you a standing ovation - Len Goodman

          J 1 Reply Last reply
          0
          • L Lost User

            jkirkerx wrote:

            I need to figure out the length calculation.

            I gave you the code for that in my previous message; and I missed a line of code, so it should read:

            int msgLength = buffer[2] << 8 + buffer[1];
            char* szWords = new char[msgLength + 1];
            strncpy(szWords, buffer + 3, msgLength);
            szWords[msgLength] = '\0';

            Unrequited desire is character building. OriginalGriff I'm sitting here giving you a standing ovation - Len Goodman

            J Offline
            J Offline
            jkirkerx
            wrote on last edited by
            #20

            So I still need to terminate the string with \0 Having trouble with the length, I did quick cheat with

            int msgLength = bytesReceived - 3;
            //int msgLength = recvbuf[2] << 8 + recvbuf[1];
            char* szWords = new char[msgLength + 1];
            strncpy(szWords, recvbuf + 3, msgLength);

            int msgLength with is an integer, I keep getting 0, is it because recvbuf[2] is returning the string, but wait, it's a byte representing a number. hmm

            L 1 Reply Last reply
            0
            • J jkirkerx

              So I still need to terminate the string with \0 Having trouble with the length, I did quick cheat with

              int msgLength = bytesReceived - 3;
              //int msgLength = recvbuf[2] << 8 + recvbuf[1];
              char* szWords = new char[msgLength + 1];
              strncpy(szWords, recvbuf + 3, msgLength);

              int msgLength with is an integer, I keep getting 0, is it because recvbuf[2] is returning the string, but wait, it's a byte representing a number. hmm

              L Offline
              L Offline
              Lost User
              wrote on last edited by
              #21

              Sorry, I really need to test my code before posting here, and check my operator precedence rules. In my defence, it is getting late and I'm half way through a nice bottle of Merlot :-D Try:

              int msgLength = (recvbuf[2] << 8) + recvbuf[1];

              Unrequited desire is character building. OriginalGriff I'm sitting here giving you a standing ovation - Len Goodman

              J 1 Reply Last reply
              0
              • L Lost User

                Sorry, I really need to test my code before posting here, and check my operator precedence rules. In my defence, it is getting late and I'm half way through a nice bottle of Merlot :-D Try:

                int msgLength = (recvbuf[2] << 8) + recvbuf[1];

                Unrequited desire is character building. OriginalGriff I'm sitting here giving you a standing ovation - Len Goodman

                J Offline
                J Offline
                jkirkerx
                wrote on last edited by
                #22

                Hey no problem, I thought perhaps I had to solve it as a test of some sort. I answer asp.net server control questions on my last beer before I turn off the computer at night. I want to thank you for helping me. It was really bring me down, and everyone just sort of gave me a blank look, "Its so easy, come on, that c++ 101". Words cannot express the gratitude for the help. I really appreciate it, and yes, code project pulls through with expert help.

                G L 2 Replies Last reply
                0
                • J jkirkerx

                  Hey no problem, I thought perhaps I had to solve it as a test of some sort. I answer asp.net server control questions on my last beer before I turn off the computer at night. I want to thank you for helping me. It was really bring me down, and everyone just sort of gave me a blank look, "Its so easy, come on, that c++ 101". Words cannot express the gratitude for the help. I really appreciate it, and yes, code project pulls through with expert help.

                  G Offline
                  G Offline
                  Goto_Label_
                  wrote on last edited by
                  #23

                  :laugh: great fun but we didnt solve the passing of byte arrays

                  J 1 Reply Last reply
                  0
                  • G Goto_Label_

                    :laugh: great fun but we didnt solve the passing of byte arrays

                    J Offline
                    J Offline
                    jkirkerx
                    wrote on last edited by
                    #24

                    oh no, it got solved! Richard wrote some code to extract the message size from byte 2, copy just the message to a new char array, termintate it with \0, and pass it to my function for processing I'm stoked, surfer happiness, yeah! I've been banging my head for days on this, feeling pretty stupid about it. Thanks for watching the show! msgLength = (recvbuf[2] << 8) + recvbuf[1]; szWords = new char[msgLength + 1]; strncpy(szWords, recvbuf + 3, msgLength); szWords[msgLength] = '\0'; _process_SQL_BufferData(szWords, bytesReceived);

                    1 Reply Last reply
                    0
                    • J jkirkerx

                      Hey no problem, I thought perhaps I had to solve it as a test of some sort. I answer asp.net server control questions on my last beer before I turn off the computer at night. I want to thank you for helping me. It was really bring me down, and everyone just sort of gave me a blank look, "Its so easy, come on, that c++ 101". Words cannot express the gratitude for the help. I really appreciate it, and yes, code project pulls through with expert help.

                      L Offline
                      L Offline
                      Lost User
                      wrote on last edited by
                      #25

                      Happy to help, it's what makes CodeProject fun! That and your appreciation.

                      Unrequited desire is character building. OriginalGriff I'm sitting here giving you a standing ovation - Len Goodman

                      1 Reply Last reply
                      0
                      • J jkirkerx

                        I understand now that the data I receive from a socket is a byte array. But I don't understand how to pass the byte array to a function for further processing. Plus I'm not sure if I should leave it as a byte array, or try to convert it to a string, so I can extract data from it. I'm confused as to whether this buffer is a pointer to data somewhere else, and If I need to make a copy of it, before passing it to a function. When I pass it to a function, the data is lost. Kind of tired of going around in circles here on this, and I need road map to head in the right direction. I make my receive buffer char recvbuf[256]; I get data 0x05 '' 0x54 'T' 0x53 'S' 0x65 'e' And I try to pass it to a function for processing. Unless just extracting the info I need does not require a function. Suggestion? void _process(char *pbuffer) { }

                        J Offline
                        J Offline
                        jschell
                        wrote on last edited by
                        #26

                        jkirkerx wrote:

                        When I pass it to a function, the data is lost.

                        What does that mean exactly? One possibility is that you are misusing the buffer. If so that has nothing to do with sockets nor with how you chose to process the data.

                        J 1 Reply Last reply
                        0
                        • J jschell

                          jkirkerx wrote:

                          When I pass it to a function, the data is lost.

                          What does that mean exactly? One possibility is that you are misusing the buffer. If so that has nothing to do with sockets nor with how you chose to process the data.

                          J Offline
                          J Offline
                          jkirkerx
                          wrote on last edited by
                          #27

                          Only the first char in the byte array passed to the function. I suspect that the 2nd byte was the data size of the packet, and the 3 byte was used for some control purpose, or an extension of the 2nd byte or something. So when I go the function I passed the data to, just the first byte is there 'T' or something. I think it was a 0x05. I have it working now, so far so good, and it's not crashing yet. I ended up passing the data in a vector to the function.

                          J 1 Reply Last reply
                          0
                          • J jkirkerx

                            Only the first char in the byte array passed to the function. I suspect that the 2nd byte was the data size of the packet, and the 3 byte was used for some control purpose, or an extension of the 2nd byte or something. So when I go the function I passed the data to, just the first byte is there 'T' or something. I think it was a 0x05. I have it working now, so far so good, and it's not crashing yet. I ended up passing the data in a vector to the function.

                            J Offline
                            J Offline
                            jschell
                            wrote on last edited by
                            #28

                            Doesn't matter what the other data was. What matters is that it was missing. Some possible reasons - You copied from one buffer to another incorrectly. - You overwrote the original buffer - You didn't have all the data in the buffer in the first place. - You are indexing incorrectly in the processing stream.

                            J 1 Reply Last reply
                            0
                            • J jschell

                              Doesn't matter what the other data was. What matters is that it was missing. Some possible reasons - You copied from one buffer to another incorrectly. - You overwrote the original buffer - You didn't have all the data in the buffer in the first place. - You are indexing incorrectly in the processing stream.

                              J Offline
                              J Offline
                              jkirkerx
                              wrote on last edited by
                              #29

                              I think it's just i no clear concept of c++, and I should buy one of those thick books on it.

                              1 Reply Last reply
                              0
                              Reply
                              • Reply as topic
                              Log in to reply
                              • Oldest to Newest
                              • Newest to Oldest
                              • Most Votes


                              • Login

                              • Don't have an account? Register

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • World
                              • Users
                              • Groups