MFC 将文本框内容转为十六进制的字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC 将文本框内容转为十六进制的字符串相关的知识,希望对你有一定的参考价值。

需要实现的是,我在文本框中输入"123456”,将其转换为“00 00 00 01 E2 40”,即转为7个字节的十六进制字符串,且每个字节间用空格隔开。这个程序改怎么写呢?
对了,还要把这个字符串和别的字符串连在一起发送给串口,很急啊,在线等!谢谢
一楼说的不是我想要的呀,大家继续啊,救救我

你看看这个是不是你要的:

发送十六进制字符
在主对话框中加入一个复选接钮,ID为IDC_CHECK_HEXSEND Caption: 十六进制发送,再利用ClassWizard为其添加控制变量:m_ctrlHexSend;
在ClassView中为SCommTestDlg类添加以下两个PUBLIC成员函数,并输入相应代码;

//由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔
//如:A1 23 45 0B 00 29
//CByteArray是一个动态字节数组,可参看MSDN帮助
int CSCommTestDlg::String2Hex(CString str, CByteArray &senddata)

int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
senddata.SetSize(len/2);
for(int i=0;i<len;)

char lstr,hstr=str[i];
if(hstr==' ')

i++;
continue;

i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;

senddata.SetSize(hexdatalen);
return hexdatalen;


//这是一个将字符转换为相应的十六进制值的函数
//好多C语言书上都可以找到
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CSCommTestDlg::ConvertHexChar(char ch)

if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);


再将CSCommTestDlg::OnButtonManualsend()修改成以下形式:
void CSCommTestDlg::OnButtonManualsend()

// TODO: Add your control notification handler code here
UpdateData(TRUE); //读取编辑框内容
if(m_ctrlHexSend.GetCheck())

CByteArray hexdata;
int len=String2Hex(m_strTXData,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据

else
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据


现在,你先将串口线接好并打开串口调试助手V2.1,选上以十六制显示,设置好相应串口,然后运行我们这个程序,在发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在串口调试助手的接收框中应该可以看到00 01 02 03 A1 CC了。

9.在接收框中以十六进制显示
这就容易多了: 在主对话框中加入一个复选接钮,IDC_CHECK_HEXDISPLAY Caption: 十六进制显示,再利用ClassWizard为其添加控制变量:m_ctrlHexDiaplay。 然后修改CSCommTestDlg::OnComm()函数:
void CSCommTestDlg::OnComm()

// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符

variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量

BYTE bt=*(char*)(rxdata+k); //字符型
if(m_ctrlHexDisplay.GetCheck())
strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
else
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放

m_strRXData+=strtemp; //加入接收编辑框对应字符串


UpdateData(FALSE); //更新编辑框内容

测试:在串口调试助手发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在本程序运行后选上以十六进制显示,在串口调试助手中单击手动发送或自动发送,则在本程序的接收框中应该可以看到00 01 02 03 A1 CC了。
留个邮箱我把原文给你追问

好像不一样哦,我从文本框中获取的是十进制的字符串“123456”要先转为16进制的,并且是7字节的,每个字节间以空格分开,在发送出去。不过你给的这个信息我也想看看。方便的话就发给我一下lishiqi84@126.com,谢谢你啦

追答

发过去了,你看一下吧~~

参考技术A 你看看这个是不是你要的:
发送十六进制字符
在主对话框中加入一个复选接钮,ID为IDC_CHECK_HEXSEND
Caption:
十六进制发送,再利用ClassWizard为其添加控制变量:m_ctrlHexSend;
在ClassView中为SCommTestDlg类添加以下两个PUBLIC成员函数,并输入相应代码;
//由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔
//如:A1
23
45
0B
00
29
//CByteArray是一个动态字节数组,可参看MSDN帮助
int
CSCommTestDlg::String2Hex(CString
str,
CByteArray
&senddata)

int
hexdata,lowhexdata;
int
hexdatalen=0;
int
len=str.GetLength();
senddata.SetSize(len/2);
for(int
i=0;i<len;)

char
lstr,hstr=str[i];
if(hstr=='
')

i++;
continue;

i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;

senddata.SetSize(hexdatalen);
return
hexdatalen;

//这是一个将字符转换为相应的十六进制值的函数
//好多C语言书上都可以找到
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char
CSCommTestDlg::ConvertHexChar(char
ch)

if((ch>='0')&&(ch<='9'))
return
ch-0x30;
else
if((ch>='A')&&(ch<='F'))
return
ch-'A'+10;
else
if((ch>='a')&&(ch<='f'))
return
ch-'a'+10;
else
return
(-1);

再将CSCommTestDlg::OnButtonManualsend()修改成以下形式:
void
CSCommTestDlg::OnButtonManualsend()

//
TODO:
Add
your
control
notification
handler
code
here
UpdateData(TRUE);
//读取编辑框内容
if(m_ctrlHexSend.GetCheck())

CByteArray
hexdata;
int
len=String2Hex(m_strTXData,hexdata);
//此处返回的len可以用于计算发送了多少个十六进制数
m_ctrlComm.SetOutput(COleVariant(hexdata));
//发送十六进制数据

else
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据

现在,你先将串口线接好并打开串口调试助手V2.1,选上以十六制显示,设置好相应串口,然后运行我们这个程序,在发送框中输入00
01
02
03
A1
CC等十六进制字符,并选上以十六进制发送,单击手动发送,在串口调试助手的接收框中应该可以看到00
01
02
03
A1
CC了。
9.在接收框中以十六进制显示
这就容易多了:
在主对话框中加入一个复选接钮,IDC_CHECK_HEXDISPLAY
Caption:
十六进制显示,再利用ClassWizard为其添加控制变量:m_ctrlHexDiaplay。
然后修改CSCommTestDlg::OnComm()函数:
void
CSCommTestDlg::OnComm()

//
TODO:
Add
your
control
notification
handler
code
here
VARIANT
variant_inp;
COleSafeArray
safearray_inp;
LONG
len,k;
BYTE
rxdata[2048];
//设置BYTE数组
An
8-bit
integerthat
is
not
signed.
CString
strtemp;
if(m_ctrlComm.GetCommEvent()==2)
//事件值为2表示接收缓冲区内有字符

variant_inp=m_ctrlComm.GetInput();
//读缓冲区
safearray_inp=variant_inp;
//VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize();
//得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++)
//将数组转换为Cstring型变量

BYTE
bt=*(char*)(rxdata+k);
//字符型
if(m_ctrlHexDisplay.GetCheck())
strtemp.Format("%02X
",bt);
//将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
else
strtemp.Format("%c",bt);
//将字符送入临时变量strtemp存放
m_strRXData+=strtemp;
//加入接收编辑框对应字符串


UpdateData(FALSE);
//更新编辑框内容

测试:在串口调试助手发送框中输入00
01
02
03
A1
CC等十六进制字符,并选上以十六进制发送,单击手动发送,在本程序运行后选上以十六进制显示,在串口调试助手中单击手动发送或自动发送,则在本程序的接收框中应该可以看到00
01
02
03
A1
CC了。
留个邮箱我把原文给你
参考技术B //CString 转十六进制 返回值 0正常返回 1长度超限 2输入错误 3没有数据
char cstrToHex(CString info , unsigned char pbuff[],DWORD &outlength)

info.Trim();
int length = info.GetLength();
if (length == 0)
return 3;
unsigned char high = 0xff, low = 0xff, ch = 0xff;
int j = 0, i = 0;
while (i < length)

if (j == 65)
return 1;
ch = info[i];
if (ch == 0x20)

i++;
continue;

else if (ch >= 0x30 && ch <= 0x39)
ch -= 0x30;
else if (ch >= 0x41 && ch <= 0x46)
ch -= 0x37;
else if (ch >= 0x61 && ch <= 0x66)
ch -= 0x57;
else
return 2;
high = ch;
if (i == length - 1)

pbuff[j] = high;
j++;
break;

else

i++;
ch = info[i];
if (ch == 0x20)

pbuff[j] = high;
j++;
i++;
continue;

else if (ch >= 0x30 && ch <= 0x39)
ch -= 0x30;
else if (ch >= 0x41 && ch <= 0x46)
ch -= 0x37;
else if (ch >= 0x61 && ch <= 0x66)
ch -= 0x57;
else
return 2;
low = ch;

pbuff[j] = high * 16 + low;
i++;
j++;

outlength = j;
return 0;
参考技术C csdn上有串口空间MScomm的例程,关于串口发送的MFC可以下载看下

javaScript中十六进制转浮点字符串转为ArrayBuffer对象ArrayBuffer转16进度字符串16进制转10进制crc校验位十六进制转包含中文的字符串(包含小程序和浏览器)

h5实现一键复制文本到剪切板

// 复制文本到剪切板
export function copyText (text) 
  // 将内容转换为字符串:
  const textString = text.toString()
  // 获取input输入框,没有dom元素的话需要自动生成
  let input = document.querySelector('#copy-input')
  if (!input) 
    input = document.createElement('input')
    input.id = 'copy-input'
    input.readOnly = 'readOnly'
    input.style.position = 'absolute'
    input.style.left = '-1000px'
    input.style.zIndex = '-1000'
    document.body.appendChild(input)
  
  input.value = textString
  // ios必须先选中文字且不支持 input.select()
  selectText(input, 0, textString.length)
  if (document.execCommand('copy')) 
    document.execCommand('copy')
   else 
    console.log('不兼容')
  
  input.blur()
  // input自带的select()方法在苹果端无法进行选择,所以需要自己实现
  // 选择文本。createTextRange(setSelectionRange)是input方法
  function selectText (textbox, startIndex, stopIndex) 
    if (textbox.createTextRange)  // ie
      const range = textbox.createTextRange()
      range.collapse(true)
      range.moveStart('character', startIndex)// 起始光标
      range.moveEnd('character', stopIndex - startIndex)// 结束光标
      range.select()// 不兼容苹果
     else  // firefox/chrome
      textbox.setSelectionRange(startIndex, stopIndex)
      textbox.focus()
    
  

ArrayBuffer转16进制字符串:

/**ArrayBuffer转16进制字符串
 * @param Buffer buffer 传入二进制数据流
 * @return String 十六进制字符串
 */
function ab2hex(buffer)
  const hexArr = Array.prototype.map.call(
    new Uint8Array(buffer),
    function(bit) 
      return ('00' + bit.toString(16)).slice(-2)
    
  )
  return hexArr.join('')

字符串转为ArrayBuffer对象

/** 
 * 字符串转为ArrayBuffer对象
 * @param String str 字符串
 * @return Buffer buffer对象
 */
function str2ab(str)
  let buf = new ArrayBuffer(str.length / 2) // buff数组
  let bufView = new Uint8Array(buf) // 一个8位无符号整型数组
  for (let i = 0, strLen = str.length; i < strLen; i++) 
    bufView[i] = parseInt(str.slice(i * 2, i * 2 + 2),16)
  
  return buf

十六进制转10进制

/***
 * 十六进制转10进制
 * 16进制转10进制(parseInt(str,a)可以将str按a进制进行转换,toString(b)将一个值转换为b进制的,如果只是简单的十六进制转十进制可以直接parseInt(str,16)默认转换为十进制,下面方法继续调用toString就是想再将其转换为其它进制比如八进制等)
 * @param Strng str 十六进制字符串
 * @return String 十六进制字符串
 */
function hex2dex (str) 
  return parseInt(str, 16).toString(10)

十六进制转浮点:

/**
 * 十六进制转浮点:
 * @param String param 十六进制字符串
 * @return Float Float
  */
function hexToSingleFlow (param) 
  function hexToSingle(t) 
    let start = t.slice(0,4)
    let end = t.slice(4,8)
    t = start + end // 有可能是 t = end + start , 有的数据前面四位和后面四位可能会调换,这个需要根据硬件中程序决定,因此这里需要根据硬件做调试进行start和end前后位置调换
    t = t.replace(/\\s+/g, "") // 去掉十进制值中的空格,但是因为上面t = start + end 前面slice的需要(js中空格也占长度),因此一般都是在调用此函数时直接去掉空格的
    if (t == "")  // 如果传入空字符,直接输出
      return ""
    
    if (t == "00000000")  // 如果传入8个0,直接输出0
      return "0"
    
    if ((t.length > 8) || (isNaN(parseInt(t, 16))))  // 如果传入字符超过8个或不能转十进制的字符,则返回错误
      return "Error"
    
    if (t.length < 8)  // 当传入的值不够8个字符时用0补齐8个字符
      t = FillString(t, "0", 8, true)
    
    t = parseInt(t, 16).toString(2) // 将十六进制字符串转换为十进制再转换为二进制
    t = FillString(t, "0", 32, true) // 将二进制字符串补齐32个字符
    let s = t.substring(0, 1) // 截取32个字符中第一个字符
    let e = t.substring(1, 9) // 截取32个字符中第2-10中8个字符
    let m = t.substring(9) // 截取32个字符中第10个开始到最后个字符
    e = parseInt(e, 2) - 127 // 将e按二进制转换后 - 127
    m = "1" + m // 给m 前面拼接'1'
    if (e >= 0)  // e 大于等于0时
      m = m.substr(0, e + 1) + "." + m.substring(e + 1) // 截取整数部分 + . + 小数部分
     else 
      m = "0." + FillString(m, "0", m.length - e - 1, true) // 小于0时: '0.' + 小数部分(继续补齐字符)
    
    if (m.indexOf(".") == -1)  // 当没有小数点时(即整数时),后面拼接 '.0'
      m = m + ".0";
    
    let a = m.split(".") // 以.分割m成数组a:[0101,001]
    let mi = parseInt(a[0], 2) // a数组第一值转二进制
    let mf = 0 // 声明一个变量mf并初始化为0
    for (let i = 0; i < a[1].length; i++)  // 用数组第二个值的长度做遍历
      mf += parseFloat(a[1].charAt(i)) * Math.pow(2, -(i + 1)) // Math.pow(a,b)方法获得值的类型是double型,含义是a的b次方 ,charAt(i)取第i个字符
    
    m = parseInt(mi) + parseFloat(mf) // 整数部分 + 小数部分
    if (s == 1)  // 当二进制第一个字符为1时将其转负数
      m = 0 - m
    
    return m
  
  // 处理字符不够情况:
  function FillString(t, c, n, b) 
    if ((t == "") || (c.length != 1) || (n <= t.length))  // 当传入的值为:t为空字符或t长度大于8或c的长度不等于1时,直接返回t
      return t
    
    let l = t.length // 得到t的长度
    for (let i = 0; i < n - l; i++)  //判断以t = c + t或t = t + c 方式用'0'补齐8个字符
      if (b == true) 
        t = c + t
      
      else 
        t += c // t = t + c
      
    
    return t
  
  return hexToSingle(param)

浮点型转十六进制:

/**
 * 浮点型转换为十六进制:
 */
function floatToHex(decString) 
  function DecToBinTail(dec, pad)
    let bin = ""
    let i
    for (i = 0; i < pad; i++) 
      dec *= 2
      if (dec >= 1) 
        dec -= 1
        bin += "1"
       else 
        bin += "0"
      
    
    return bin
  
  function DecToBinHead(dec,pad) 
    let bin=""
    let i
    for (i = 0; i < pad; i++) 
      bin = (parseInt(dec % 2).toString()) + bin
      dec /= 2
    
    return bin
  
  function Right(String, Length) 
    if (String == null) return (false)
      let dest = ''
      for (let i = (String.length - 1); i >= 0; i--) 
        dest = dest + String.charAt(i)
      
      String = dest
      String = String.substr(0, Length)
      dest = ''
      for (let i = (String.length - 1); i >= 0; i--) 
        dest = dest + String.charAt(i)
      
      return dest
  
  let dec = decString
  let sign
  let signString
  let decValue = parseFloat(Math.abs(decString))
  let exponent
  if (decString.toString().charAt(0) == '-') 
    sign = 1;
    signString = "1"
   else 
    sign = 0
    signString = "0"
   if (decValue==0) 
    fraction = 0
    exponent = 0
   else 
    exponent = 127;
    if (decValue>=2) 
      while (decValue >=2 ) 
        exponent++
        decValue /= 2
      
     else if (decValue <1 ) 
      while (decValue < 1) 
        exponent--
        decValue *= 2
        if (exponent ==0) break
      
    
    if (exponent!=0) decValue-=1; else decValue /= 2
  
  let fractionString = DecToBinTail(decValue, 23)
  let exponentString = DecToBinHead(exponent, 8)
  return Right('00000000'+parseInt(signString + exponentString + fractionString, 2).toString(16),8)

将某段字符串使用某字符补齐

/**
 * 将某段字符串使用某段字符补齐:
 * @param String hexStr 需要转换的字符串
 * @param Number count 转换后字符串的总长度
 * @param String str 要拼接的字符
 * @param Boolean isFront 是否在前面拼接,值为true时将str拼接到元字符串的前面,false则相反
 * @return String 十六进制字符串
 */
function useStrFill (hexStr,count,str,isFront) 
  let hexlength = hexStr.toString().length
  let n = count -hexlength
  let strHal = ''
  if (n > 0) 
    for (let i = 0; i < n / str.length; i++) 
      strHal += str
    
    let result = ''
    if (isFront) 
     result = strHal + hexStr
     else (
      result = hexStr + strHal
    )
    return result
   else 
    return hexStr.slice(hexlength  - count,hexlength)
  

十六进制转带符号(-负号)整型

/**
 * 十六进制转带符号整型
 * @param String hexStr 十六进制字符串
 */
function hex2int(hexStr) 
  // 将十六转十进制,再转2进制
  let twoStr = parseInt(hexStr,16).toString(2)
  // 1个字节 = 8bit ,0xff 一个 "f"就是4位
  let bitNum = hexStr.length * 4
  if(twoStr.length < bitNum)
    while(twoStr.length < bitNum)
      twoStr = "0" + twoStr
    
  
  if(twoStr.substring(0,1) == "0")
    // 正数, // 二进制转十进制
    twoStr = parseInt(twoStr,2)
    return twoStr
  else
    // 负数
    let twoStr_unsign = ""
    // 补码:(负数)反码+1,符号位不变;相对十进制来说也是 +1,但这里是负数,+1就是绝对值数据-1
    twoStr = parseInt(twoStr,2) - 1
    twoStr = twoStr.toString(2)
     // 舍弃首位(符号位)
    twoStr_unsign = twoStr.substring(1,bitNum)
    // 去除首字符,将0转为1,将1转为0   反码
    twoStr_unsign = twoStr_unsign.replace(/0/g, "z")
    twoStr_unsign = twoStr_unsign.replace(/1/g, "0")
    twoStr_unsign = twoStr_unsign.replace(/z/g, "1")
    twoStr = parseInt(-twoStr_unsign, 2);
    return twoStr
  

带符号(负号)整数转十六进制字符串(得到8个字符十六进制字符串)

/** 
 * 带符号(负号)整数转十六进制字符串
 * @param Number number 整型,可带符号
 * @return String 8个字符长度的十六进制字符串
*/
function decToHex(number)
  return (parseInt(number,10)>>>0).toString(16)

带符号(负号)整数转二进制字符串(4个字符)

可以将上一个方法decToHex得到的结果截取后四位,效果一样

/** 
 * 带符号(负号)整数转二进制字符串(4个字符)
 * @param Number number 整型,可带符号
*/
function signDecToHex(i) 
  return (i+0x10000).toString(16).substr(-4).toUpperCase()

十六进制转包含中文字符串,解码十六进制字符(强调小程序和浏览器不同)

/** 
 * 十六进制字符串转中文
 * @param String hex 为十六进制字符串
 * @return String 包含中文的字符串
*/
function hexToStr(hex) 
  // 去掉字符串首尾空格
  let trimedStr = hex.trim()
  // 判断trimedStr前两个字符是否为0x,如果是则截取从第三个字符及后面所有,否则返回全部字符
  let rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr
  // 得到rawStr的长度
  let len = rawStr.length
  // 如果长度不能被2整除,那么传入的十六进制值有误,返回空字符
  if (len % 2 !== 0) 
    return ""
  
  let curCharCode // 接收每次循环得到的字符
  let resultStr = [] // 存转换后的十进制值数组
  for (let i = 0; i < len; i = i + 2) 
    curCharCode = parseInt(rawStr.substr(i, 2), 16)
    resultStr.push(curCharCode)
  
  // encoding为空时默认为utf-8
  let bytesView = new Uint8Array(resultStr) // 8 位无符号整数值的类型化数组
  // TextEncoder和TextDecoder对字符串和字节流互转  
  // let str = new TextDecoder(encoding).decode(bytesView)因为小程序中没有TextDecoder,经查阅资料,下载https://github.com/inexorabletash/text-encoding并const encoding = require("./text-encoding-master/lib/encoding.js")引入后使用下面方式即可:
  let str MFC 编辑框输入16进制字符串转换为16进制数或者10进制数据计算

javaScript中十六进制转浮点字符串转为ArrayBuffer对象ArrayBuffer转16进度字符串16进制转10进制crc校验位十六进制转包含中文的字符串(包含小程序和浏览器)

VC做串口程序如何把编辑框中的字符串转换成16进制数

将文本框字符串以十进制形式转换为数据库

将十六进制的颜色字符串转为UIColor

php 如何将 16进制字符串转为16进制字符数组 或者将 2进制字符串转为16进制字符数组