2020-10-18

francis_xiiiv · · 738 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

多种编程语言的hex string转换为字节数组实现方法

       hex string也被称为16进制字符串,由"0123456789abcdefABCDEF"中的若干多个字符组成16进制字符串。因为一个16进制字符相当于2进制的4个位(例如:16进制"a"表示为2进制的"1010"),一个字节是8位组成(例如:一个字节用2进制表示为"10101011",用16制表示为"AB")。所以,16进制字符串(需要转换为字节数组)的长度必须是偶数。"AB1"和"efab3"是不符合的,而"AB11"是符合的。

       我们在项目研发过程中,经常会在各个组件中传送字节组的16进制字符串,所以各组件(不同编程语言实现)需要对16进制字符串进行解码,最终产生字节数组对象。有感于不同编程语言中迥然不同的语法,整理了我们区块链项目的不同语言下hex string转换为字节数组实现方法。

C++代码实现

#include <string>
using std::string;

void HexToBytes(const string& hex,uint8_t *result) {
        for (uint32_t index=0;index<hex.length();index+=2){
                string byteString = hex.substr(index,2);
                uint8_t byte =(uint8_t)strtol(byteString.c_str(),NULL,16);
                result[index/2]=byte;
        }
}

int main(int argc,char *argv[]){
        uint8_t challege[4];
        HexToBytes("12ab1212",challege);
        ...
}

python 3.5以上代码实现
注意:python在不同版本上有不同实现方法,我们的版本是3.7。

import bytes

def HexToBytes(hex):
    return bytes.fromhex(hex)

golang代码实现

import (
        "encoding/hex"
)

func HexToBytes(hexStr string) []byte {
        hexBytes,err := hex.DecodeString(hexStr)
        if err==nil {
                return hexBytes
        } else {
                return nil
        }
}

java代码实现

import java.math.BigInteger;

public static byte[] hexToBytes(String hex) {
  return new BigInteger(hex, 16).toByteArray();
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:francis_xiiiv

查看原文:2020-10-18

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

738 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传