[算法题] 字节流解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 字节流解析 题目标题: 根据数值占用BIT数,按顺序从输入字节流中解析出对应数值,解析顺序按输入数组astElement索引升序。 详细描述: 接口说明 原型: voidDecode(unsignedintuiIutputLen,unsignedcharaInpu...

字节流解析

题目标题:

  • 根据数值占用BIT数,按顺序从输入字节流中解析出对应数值,解析顺序按输入数组astElement索引升序。

详细描述:

  • 接口说明

原型:

voidDecode(unsignedintuiIutputLen,unsignedcharaInputByte[],unsignedintuiElementNum,ELEMENT_STRU astElement[]);

输入参数:

     unsignedintuiIutputLen:字节数组(流)长度

unsignedcharaInputByte:字节数组(流)

     unsignedintuiElementNum:解析数值个数

ELEMENT_STRU astElement[]:数值的结构数组指针,含义如下

     Struct

{

     unsignedintuiElementLength;    //表示uiElementValue占用BIT数,范围1~32

     unsignedintuiElementValue;     //从字节流中按顺序解析的数值,用于输出

}ELEMENT_STRU;

输出参数(指针指向的内存区域保证有效):

    参见上述ELEMENT_STRU中uiElementValue描述

返回值:

    Void

举例:

输入:

字节数组长度uiIutputLen为2;

字节数组aInputByte[2]为{0x62, 0x80},对应二进制为“01100010 1 000 0000”;

解析数值个数uiElementNum为2;

数值[0]的值占4个bit,即astElement[0].uiElementLength = 4;

数值[1]的值占5个bit,即astElement[1].uiElementLength = 5;

输出:

数值[0]的值为6,二进制为“0110”,即astElement[0].uiElementValue = 6;

数值[1]的值为5,二进制为“0010 1”,即astElement[1].uiElementValue = 5。

 

 

 //OJ.h

#ifndef __OJ_H__
#define __OJ_H__

typedef struct
{
    unsigned int uiElementLength; //表示数值uiElementValue占用BIT数,范围1~32
    unsigned int uiElementValue; //表示编码的数值
}ELEMENT_STRU;

void Decode(unsigned int uiIutputLen, unsigned char aInputByte[], unsigned int uiElementNum, ELEMENT_STRU astElement[]);


#endif

 

 //OJ.cpp

#include "OJ.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BITS_NUM_OF_BYTE    (8)
#define BITS_MALLOC_SIZE    (9)
#define ELEM_MAX_SIZE       (32)
#define ELEM_MALLOC_SIZE    (33)


/*******************************************************************************
Func Name       : ByteTransToBits
Date Created    : 2013-11-29
Author          : 
Description : Input : unsigned char aInputByte[], 待转化的字节 unsigned int uiIutputLen, 实际长度 Output : char *pcStrBuf, 转化后的二进制字符串 Return : Caution : History : Date Author Modification ******************************************************************************
*/ void ByteTransToBits ( unsigned char aInputByte[], unsigned int uiIutputLen, char *pcStrBuf ) { unsigned int i = 0; unsigned int j = 0; unsigned int index = 0; char acTmp[BITS_MALLOC_SIZE] = {0}; for (i = 0; i < uiIutputLen; i++) { _itoa_s(aInputByte[i], acTmp, BITS_MALLOC_SIZE, 2); if (strlen(acTmp) < BITS_NUM_OF_BYTE) //如果itoa转化的二进制串不满8位,则在头部加'0' { j = BITS_NUM_OF_BYTE - (unsigned int)strlen(acTmp); while (j-- > 0) { pcStrBuf[index] = '0'; index++; } memcpy(pcStrBuf + index, acTmp, (unsigned int)strlen(acTmp)); index += (unsigned int)strlen(acTmp); memset(acTmp, 0, BITS_MALLOC_SIZE); continue; } memcpy(pcStrBuf + index, acTmp, strlen(acTmp)); memset(acTmp, 0, BITS_MALLOC_SIZE); printf("\n%s : %d", acTmp, strlen(acTmp)); } } /******************************************************************************* Func Name : BitsTransToNum Date Created : 2013-11-29 Author :
Description : 根据数值所占位数,截取二进制字符串,获取真实数值 Input : char *pcStrBuf, 二进制字符串 unsigned int uiElementNum, 有效二进制位数 Output : ELEMENT_STRU astElement[], 数值结构体 Return : Caution : History : Date Author Modification ******************************************************************************
*/ void BitsTransToNum ( char *pcStrBuf, unsigned int uiElementNum, ELEMENT_STRU astElement[] ) { int iNum = 0; unsigned int i = 0; unsigned int j = 0; unsigned int index = 0; char acNum[ELEM_MALLOC_SIZE] = {0}; index = 0; for (i = 0; i < uiElementNum; i++) { iNum = 0; memset(acNum, 0, ELEM_MALLOC_SIZE); if (astElement[i].uiElementLength < 1 || astElement[i].uiElementLength > ELEM_MAX_SIZE) { return; } memcpy(acNum, pcStrBuf + index, astElement[i].uiElementLength); index += astElement[i].uiElementLength; for (j = 0; j < (unsigned int)strlen(acNum); j++) { iNum = iNum << 1; iNum = iNum + acNum[j] - '0'; } astElement[i].uiElementValue = iNum; } } /* 功能: 根据数值占用BIT数,按顺序从输入字节流中解析出对应数值,解析顺序按输入数组astElement索引升序 输入: unsigned int uiIutputLen:字节数组(流)长度 unsigned char aInputByte:字节数组(流) unsigned int uiElementNum:解析数值个数 ELEMENT_STRU astElement[]:数值的结构数组指针,含义如下 Struct { unsigned int uiElementLength; //表示uiElementValue占用BIT数,范围1~32 unsigned int uiElementValue; //从字节流中按顺序解析的数值,用于输出 }ELEMENT_STRU; 输出:参见上述ELEMENT_STRU中uiElementValue描述 返回:void */ void Decode ( unsigned int uiIutputLen, unsigned char aInputByte[], unsigned int uiElementNum, ELEMENT_STRU astElement[] ) { char *pcStrBuf = NULL; if (NULL == aInputByte || NULL == astElement || 0 >= uiIutputLen || 0 >= uiElementNum) { return; } /* 步骤0. 初始化字符串指针 */ pcStrBuf = (char*) malloc (uiIutputLen * BITS_MALLOC_SIZE); if (NULL == pcStrBuf) { return; } memset(pcStrBuf, 0, uiIutputLen * BITS_MALLOC_SIZE); /* 步骤1. 把字节数组aInputByte转为二进制字符串,存入pcStrBuf */ ByteTransToBits(aInputByte, uiIutputLen, pcStrBuf); /* 步骤2. 根据数值所占位数,截取二进制字符串,获取真实数值 */ BitsTransToNum(pcStrBuf, uiElementNum, astElement); free(pcStrBuf); return; }

 

 

 

目录
相关文章
|
22天前
|
存储 安全 Java
字节流和字符流有哪些区别
字节流和字符流是Java中两种基本的I/O流类型。字节流以8位字节为单位处理数据,适用于所有类型的文件;字符流以16位Unicode字符为单位,专为文本文件设计,自动完成字符编码转换,更适合文本处理。
41 2
|
22天前
|
存储 数据安全/隐私保护
如何选择使用字节流还是字符流
在处理文件或网络数据时,选择字节流(如InputStream/OutputStream)适合处理二进制数据,而字符流(如Reader/Writer)则适用于文本数据,能自动处理字符编码问题,确保文本正确读写。选择依据主要看数据类型及是否需要编码转换。
33 2
|
2月前
|
Java
字节流与字符流的差异
【10月更文挑战第13天】总的来说,字节流和字符流各有其特点和适用范围,我们需要根据具体的需求来选择使用哪种类型的流。在实际应用中,还需要注意编码问题、性能优化等方面,以确保数据的正确处理和高效传输。
|
3月前
|
XML JSON 网络协议
超级好用的C++实用库之字节流解析器
超级好用的C++实用库之字节流解析器
40 3
|
3月前
|
文件存储 C语言 C++
超级好用的C++实用库之字节流合成器
超级好用的C++实用库之字节流合成器
25 3
|
5月前
|
XML JSON 安全
Base64编码原理与在网络传输中的应用
Base64编码原理与在网络传输中的应用
|
SQL JSON 分布式计算
关于序列化协议,你需要知道的一些内容(2)
关于序列化协议,你需要知道的一些内容(2)
|
XML 存储 JSON
关于序列化协议,你需要知道的一些内容(3)
关于序列化协议,你需要知道的一些内容(3)
|
Java 调度
序列化和编码的不同点
序列化和编码的不同点
238 0
序列化和编码的不同点
|
移动开发 Linux Windows
IO流概述分类、字节流写数据、字节流写数据的三种方式及写数据的两个小问题
IO流概述分类、字节流写数据、字节流写数据的三种方式及写数据的两个小问题的简单示例
127 0
IO流概述分类、字节流写数据、字节流写数据的三种方式及写数据的两个小问题