字符串数组保存16进制的两种方式
方式一:(修改随时修改下标的16 进制的值,如下只存了5 个字节,后面还可以添加其它的数据,比较灵活)
unsigned char ReadData[ 10 ] = { 0xff , 0xff , 0x01 , 0xf6 , 0x00 } ;
比如:ReadData[ 0 ] = 0x12 ;
方式二:不够灵活,初始化后就固定大小了
unsigned char ReadData[ ] = "\xff\xff\x00"
10进制转换为16进制(背景需要16进制数给串口通信使用)
计算机的解释方式不一样
例子:
# include <stdio.h>
int main ( )
{
int i = 11 ;
unsigned char p = i;
printf ( "p %02x\n" , p) ;
if ( i == 0x0b )
{
printf ( "equal\n" ) ;
}
else
printf ( " not equal\n" ) ;
}
snprintf ( buf, 256 , "%02x%02x" , 0x02 , 0x22 ) ;
这种方式生成的是buf字符串,== > "0222" 是4 个字节,不是两个字节了
这种方式只能用于打日志,不可能串口通信,虽然串口通信的api的参数是unsigned char * 类型的,但是每个字节都是0x22 , 0x02 这样的,或者对应的10 进制数
QT控件 QlineEdit输入的QString比如为12,需要将字符串转为对应的16进制 “12” >0x12 >12
"12" == > 0x12 ;
Mydata == > "12"
hexValue = 12
void TohexChar ( unsigned char & hexValue , QString Mydata)
{
std:: string str = Mydata. toStdString ( ) ;
qDebug ( ) << "str" << str. c_str ( ) ;
hexValue = strtoul ( str. c_str ( ) , NULL , 16 ) ;
printf ( "hexValue %02x\n" , hexValue) ;
return ;
}
将unsigned char *转为QString
QString str2;
for ( int i = 0 ; i < _mSerial-> ReadDataLen; ++ i) {
QString hex = QString ( "%1" ) . arg ( _mSerial-> ReadData[ i] , 2 , 16 , QLatin1Char ( '0' ) ) ;
str2. append ( hex) ;
}
qDebug ( ) << "Converted string:" << str2;
16进制转换对应的ASCLL 比如 0x11 0x12 ==> 11 12
void hex_ToString ( unsigned char * src, int Slen, char * out)
{
if ( src == nullptr || Slen <= 0 )
return ;
for ( int i = 0 ; i < Slen ; i++ )
{
sprintf ( out + i * 2 , "%02x" , src[ i] ) ;
}
return ;
}
int main ( )
{
unsigned char buf[ 2 ] ;
buf[ 0 ] = 0x11 ;
buf[ 1 ] = 0x12 ;
char out[ 10 ] = { '\0' } ;
hex_ToString ( buf, 2 , out) ;
printf ( "out [%s]\n" , out) ;
}
将16精致转换成ASCLL 比如0x34 ==> 4
char ch = 0x34 ;
char i;
sprintf ( & i, "%c" , ch) ;
printf ( "i %c\n" , i) ;
将16进制转换成10进制 比如0x00 0x00 0x00 0x15 ==> 21
char fileOperAuth[ 4 ] = { 0x00 , 0x00 , 0x00 , 0x15 } ;
unsigned long lenOperAuth = ( unsigned long ) fileOperAuth[ 3 ] | ( unsigned long ) fileOperAuth[ 2 ] << 8 | ( unsigned long ) fileOperAuth[ 1 ] << 16 | ( unsigned long ) fileOperAuth[ 0 ] << 24 ;
补零问题
左边不够补零 比如14 == > 0014
sprintf ( i_partType , "%04d" , ii_partType) ;
字符串转对应的16进制 “303030304646” 转 0x30 0x30 0x30 0x30 0x46 0x46
const char * input = "303030304646" ;
for ( int i = 0 ; i < 12 ; i += 2 ) {
unsigned int hexValue;
sscanf ( input + i, "%2x" , & hexValue) ;
printf ( "%02X " , hexValue) ;
}
16进制转字符串
# include <stdio.h>
# include <ctype.h>
# include <string>
# include <string.h>
# include <stdlib.h>
struct StrToHex
{
int ContentLen;
unsigned char HexData[ 1024 ] ;
} ;
using namespace std;
unsigned char StringToHexSub ( const char * pbSrc)
{
unsigned char s1 = toupper ( pbSrc[ 0 ] ) - 0x30 ;
if ( s1 > 9 ) s1 -= 7 ;
unsigned char s2 = toupper ( pbSrc[ 1 ] ) - 0x30 ;
if ( s2 > 9 ) s2 -= 7 ;
unsigned char s3 = s1 * 16 + s2;
return s3;
}
int StringToHex ( char * str, StrToHex * data)
{
string temp = str;
string temp2;
unsigned char * decimal = new unsigned char [ sizeof ( unsigned char ) * ( temp. length ( ) / 2 ) ] ;
int j = 0 ;
for ( int i = 0 ; i < temp. length ( ) / 2 ; i++ )
{
temp2 = temp. substr ( 2 * i, 2 ) ;
decimal[ j] = StringToHexSub ( temp2. c_str ( ) ) ;
j++ ;
}
data-> ContentLen = j;
memcpy ( data-> HexData, decimal, data-> ContentLen) ;
return 0 ;
}
int main ( )
{
char * str = "3030201099" ;
StrToHex data;
memset ( & data, 0x00 , sizeof ( StringToHex) ) ;
StringToHex ( str, & data) ;
printf ( "%s\n" , data. HexData) ;
for ( int i = 0 ; i < data. ContentLen ; i ++ )
{
printf ( "%2x" , data. HexData[ i] ) ;
}
return 0 ;
}