模擬

WJnuHhail發表於2024-06-24
/******************************************************************************************************
 * @file name:		  :Simulation(malloc)
 * @brief  		      :模擬獲取資料,把首地址返回
 * @author 		      :wvjnuhhail@126.com
 * @date 			  :2024/06/24
 * @version 1.0 	  :V1.0
 * @property 		  :暫無
 * @note   		      :None
 * CopyRight (c)  2023-2024   wvjnuhhail@126.com   All Right Reseverd
 ******************************************************************************************************/

/***********************************************標頭檔案******************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**********************************************END*******************************************************/

/*
 *     使用malloc申請30個位元組,模擬報文傳輸
 *  用這個30位元組的空間來存放報文資料,報文資料:前4個位元組存放正文段的位元組大小,
 *  接下來的9個位元組存放傳送者的名字(旦丁),剩餘的空間存放(hello Dante)正文
 *
 */

/***********************************宏定義***************************************************************/
#define MESSAGE_LEN 30
#define TEXT_SIZE_POS 0
#define SENDER_POS 5
#define TEXT_POS 12
/***********************************END*****************************************************************/

/********************************************************************************************************
 * @function_name   :	Get_Message_Data
 * @brief           : 模擬獲取資料
 * @param           : NONE
 * @retval          : void
 * @date 			      :2024/06/24
 * @version         :V1.0
 * @note   		      :None
 *******************************************************************************************************/

char *Get_Message_Data()
{
  char *message_data_p = (char *)malloc(sizeof(char) * MESSAGE_LEN);
  if (message_data_p == (char *)NULL)
  {
    printf("申請存放報文資料堆空間失敗!\n");
    return (char *)NULL;
  }

  memset(message_data_p, 0, sizeof(char) * MESSAGE_LEN);

  // 在前4個位元組中存放資料的大小 11
  char Name[] = "但丁";
  char text[] = "hello dante";
  int text_len = strlen(text);

  memcpy(message_data_p + TEXT_SIZE_POS, &text_len, sizeof(int));
  memcpy(message_data_p + SENDER_POS, Name, strlen(Name));
  memcpy(message_data_p + TEXT_POS, text, text_len);

  return message_data_p;
}

int main()
{

  char *message_data_p = Get_Message_Data();
  if (message_data_p == (char *)NULL)
  {
    perror("獲取報文資料失敗!\n");
    exit(1);
  }

  printf("獲取報文資料成功,如下:\n");
  printf("[data size: %d byte]\n", *((int *)message_data_p + TEXT_SIZE_POS));
  printf("[Sender: %s]\n", message_data_p + SENDER_POS);
  printf("[message data 資料正文: %s]\n", message_data_p + TEXT_POS);

  free(message_data_p);
  return 0;
}