javaScript中十六进制转浮点字符串转为ArrayBuffer对象ArrayBuffer转16进度字符串16进制转10进制crc校验位十六进制转包含中文的字符串(包含小程序和浏览器)
Posted 苦海123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 51单片机c语言如何把浮点型转为字符串 ?