多种编程语言的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();
}
有疑问加站长微信联系(非本文作者)