字符串转ASSII字符串相互处理

简介: 字符串转ASSII字符串相互处理

字符串转ASSII字符编解码

最近在做tetra网络相关的项目时,涉及到字符串转ASSII的方式进行消息的编码方式,以及对应的解码,就整理一下:

1:其实就是把字符串中每个字符,取高四位,存储对应的十六进制值对应的字符串。

2:反向解析,把ASSII字符串每两个做拼接,转成十进制求出assii对应的字符进行存储。

涉及到一个没有关注到的知识点:位运算符:左移(<<)和右移(>>)

注意:左移和右移并不会改变指针指向,配合&,|,^可以对数据做一些列操作

>> 右移符号,对应的二进制位,正数左边补0,负数左边补1

<< 左移符号,对应的二进制位,右边补0,

字符处理:

取字符c高四位对应的数值: (c>>4) & 0xF (先右移4位,即左边二进制补齐4位,求得高四位对应数值)

取字符c低四位对应的数值: c & 0x0F

源码demo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//最近在做tetra网络相关的项目时,涉及到字符串转ASSII的方式进行消息的编码方式,以及对应的解码,就整理一下
int str2ASSIIHex(const char* str, const int data_len, char* out_buff);
int ASSII2StrHex(const char* assii_str, const int assii_len, char * data, int len);
int main()
{
  const char* str= "ABCJKL";
  char * assi_str = (char*)malloc((strlen(str)*2));
  if(assi_str == NULL)
  {
    printf("malloc error \n");
    return -1;
  }
  printf("src str:%s \n", str);
  str2ASSIIHex(str, strlen(str), assi_str);
  printf("ASSII_STR:%s %lu\n", assi_str,strlen(assi_str));
  char * dst_str = (char*)malloc(strlen(str));
  if(dst_str == NULL)
  {
    printf("malloc dst str error \n");
    free(assi_str);
    return -1;
  }
  ASSII2StrHex(assi_str, strlen(assi_str), dst_str, strlen(str));
  printf("dst str:%s %lu \n", dst_str, strlen(dst_str));
  free(assi_str);
  free(dst_str);
  return 0;
}
//把字符串转为assii对应的十六进制内容进行存储   ==》取高四位 存对应的字符    取低四位  存对应的字符
//实际上字符串的长度扩大了2倍
int str2ASSIIHex(const char* str, const int data_len, char* out_buff)
{
  if(str == NULL || data_len <= 0 || out_buff == NULL)
  {
    return -1;
  }
  char hexval[16] = { '0', '1', '2', '3', '4', '5', '6', '7', 
            '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
  //对字符串数据进行处理 取高四位,低四位然后拼接
  for(int j =0; j<data_len; j++)
  {
    out_buff[j*2] = hexval[(str[j]>>4) & 0xF]; //取高四位
    out_buff[j*2+1] = hexval[(str[j]) & 0x0F]; //取低四位
  }
  //out_buff就是最终转出来的十六进制的数
  return 0;
}
//直接把字符转成数字  然后求十六进制
static int char2num(char c)
{
  int ret = -1;
  switch(c)
  {
    case '0': ret = 0; break;
    case '1': ret = 1; break;
    case '2': ret = 2; break;
    case '3': ret = 3; break;
    case '4': ret = 4; break;
    case '5': ret = 5; break;
    case '6': ret = 6; break;
    case '7': ret = 7; break;
    case '8': ret = 8; break;
    case '9': ret = 9; break;
    case 'a':
    case 'A': ret = 10; break;
    case 'b':
    case 'B': ret = 11; break;
    case 'c':
    case 'C': ret = 12; break;
    case 'd':
    case 'D': ret = 13; break;
    case 'e':
    case 'E': ret = 14; break;
    case 'f':
    case 'F': ret = 15; break;
  }
  return ret;
}
//把上文存储的 ASSII转为字符串
int ASSII2StrHex(const char* assii_str, const int assii_len, char * data, int len)
{
  if(assii_str == NULL || data == NULL || assii_len/2 >len)
  {
    printf("paras is null.");
    return -1;
  }
  int assi_num;
  for(int i = 0; i<assii_len/2; i++)
  {
    assi_num = char2num(assii_str[2*i])*16 + char2num(assii_str[2*i+1]);
    data[i] = assi_num;
  }
  return 0;
}
/****************************
//运行结果   注意 这里其实对应的是assii字符对应的十六进制的值字符
src str:ABCJKL 
ASSII_STR:4142434a4b4c 12
dst str:ABCJKL 6 
*****************************/
目录
相关文章
|
Java jvm-sandbox Perl
Jvm-Sandbox源码分析--启动简析
1.工作原因,使用jvm-sandbox比较多,遂进行源码分析,做到知己知彼,个人能力有限,如有错误,欢迎指正。 2.关于jvm-sandbox 是什么,如何安装相关环境,可移步官方文档 3.源码分析基于jvm-sandbox 最新的master代码,tag-1.2.1。
8292 1
Jvm-Sandbox源码分析--启动简析
|
监控 前端开发 网络协议
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(5)-Fiddler监控面板详解
【7月更文挑战第20天】Fiddler是一款强大的HTTP协议调试代理工具,它的监控面板是核心功能,记录服务器的请求会话,包括HTTP和HTTPS。监控面板分为多个标签,如统计数据(Statistics)展示性能指标,Inspector用于查看请求和响应的详细内容,AutoResponder允许重定向请求到本地资源,Composer用于构造和调试HTTP请求,还有Orchestra Beta、Fiddler Script、Log和Filters等功能。
424 14
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(5)-Fiddler监控面板详解
|
前端开发 JavaScript
在Vue中,如何使用CSS过渡和动画来实现淡入淡出的效果?
在Vue中,如何使用CSS过渡和动画来实现淡入淡出的效果?
777 1
|
11月前
|
安全 Linux 网络安全
安装和使用Paramiko
安装和使用Paramiko
854 3
|
Ubuntu Linux
在Linux中, 如何创建一个快照?
在Linux中, 如何创建一个快照?
|
安全 数据可视化 Java
linux安装ElasticSearch7.1和 kibana 启动
linux安装ElasticSearch7.1和 kibana 启动
219 1
|
域名解析 存储 缓存
Windows server——部署DNS服务
Windows server——部署DNS服务
12126 1
|
前端开发 JavaScript 程序员
用html和css写一个简约的名片
用html和css写一个简约的名片
599 0
|
存储 运维 NoSQL
阿里云内存数据库Tair新一代集群无感数据迁移
本文将阐述社区开源版本集群数据迁移的技术,阿里云Tair for Redis集群早期对社区迁移数据的增强改进以及演进到新一代基于Slot复制的无感数据迁移原理。
1225 0
|
Java Nacos
java:nacos集群部署报错Address already in use
java:nacos集群部署报错Address already in use
390 0