用柔性数组处理Pascal字符串内存块

来源:互联网 发布:淘宝o2o平台 编辑:程序博客网 时间:2024/04/30 20:16

Pascal字符串定义

2个字节的WORD定义为长度N, 后面的Ascii字符串数据长度为N.


/// @file exam_1_3.c/// @brief /**exam_1_3 * 玩结构体, 纯pascal字符串内存区, pascal串一个连一个. 要求遍历每个pascal串,并打印.要求有通用性, 用柔性数组来玩*/#include <windows.h>#include <stdlib.h>#include <stdio.h>/// 用柔性数组来玩pascal字符串的访问typedef struct _tag_flexible_array{    WORD wSizePascalString; ///< 控制计划内越界访问的数据size    /// 利用这个1字节的数组和wSizePascalString的控制, 玩计划内的数组越界访问    char cPascalStringData[1];}TAG_FLEXIBLE_ARRAY;BOOL ParsePascalStringBufferAndPrint(unsigned char* pcBuf, size_t nSizeBuf);int main(int argc, char *argv[ ], char *envp[ ]){    BOOL bRc = FALSE;    unsigned char data[48] = {        0x0C, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x0D, 0x00,         0x77, 0x77, 0x77, 0x2E, 0x70, 0x65, 0x64, 0x69, 0x79, 0x2E, 0x63, 0x6F, 0x6D, 0x04, 0x00, 0x6A,         0x6A, 0x79, 0x79, 0x03, 0x00, 0x43, 0x2B, 0x2B, 0x06, 0x00, 0x63, 0x6F, 0x70, 0x79, 0x54, 0x6F    };    bRc = ParsePascalStringBufferAndPrint(data, sizeof(data));    printf("parse data[] is %s\n", bRc ? "TRUE" : "FALSE");    /** run result    Hello world!    www.pediy.com    jjyy    C++    copyTo    parse data[] is TRUE    */    printf("END, press any key to quit\n");    getchar();        return 0;}BOOL ParsePascalStringBufferAndPrint(unsigned char* pcBuf, size_t nSizeBuf){    BOOL bRc = FALSE;    int i = 0;    TAG_FLEXIBLE_ARRAY* pPascalBlock = NULL;    size_t nSizeWasOpted = 0; ///< 已经操作过的pascal数据长度    do     {        if (NULL == pcBuf)        {            break;        }        do         {            pPascalBlock = (TAG_FLEXIBLE_ARRAY*)(pcBuf + nSizeWasOpted);            if ((nSizeWasOpted + sizeof(WORD) + pPascalBlock->wSizePascalString) > nSizeBuf)            {                bRc = FALSE;                break;            }            for (i = 0; i < pPascalBlock->wSizePascalString; i++)            {                printf("%c", pPascalBlock->cPascalStringData[i]);            }            printf("\n");            nSizeWasOpted += sizeof(WORD) + pPascalBlock->wSizePascalString;            if (nSizeWasOpted >= nSizeBuf)            {                bRc = TRUE;                break;            }        } while (1);    } while (0);    return bRc;}


0 0
原创粉丝点击