golang 将[]byte转成16进制的实现

将[]byte转成16进制

import "crypto/md5"

import "fmt"

sign := md5.Sum([]byte("date string"))

signStr := fmt.Sprintf("%x", sign) //将[]byte转成16进制

补充:golang []byte存储存储的16进制转10进制

项目中有用[]byte存储16进制需要转到10进制,如果用系统自带的函数处理,需要先将[]byte通过hex.EncodeToString转为string,再用strconv.ParseInt转到10进制,过程中由于两次转换导致内存分配过多(每秒执行近100w次),GC出现错误导致进程挂掉。

自己写了一个函数来转,主要是避免出现内存泄漏:

var b2m_map map[byte]uint64 = map[byte]uint64{

0x00: 0,

0x01: 1,

0x02: 2,

0x03: 3,

0x04: 4,

0x05: 5,

0x06: 6,

0x07: 7,

0x08: 8,

0x09: 9,

0x0A: 10,

0x0B: 11,

0x0C: 12,

0x0D: 13,

0x0E: 14,

0x0F: 15,

0x10: 16,

0x11: 17,

0x12: 18,

0x13: 19,

0x14: 20,

0x15: 21,

0x16: 22,

0x17: 23,

0x18: 24,

0x19: 25,

0x1A: 26,

0x1B: 27,

0x1C: 28,

0x1D: 29,

0x1E: 30,

0x1F: 31,

0x20: 32,

0x21: 33,

0x22: 34,

0x23: 35,

0x24: 36,

0x25: 37,

0x26: 38,

0x27: 39,

0x28: 40,

0x29: 41,

0x2A: 42,

0x2B: 43,

0x2C: 44,

0x2D: 45,

0x2E: 46,

0x2F: 47,

0x30: 48,

0x31: 49,

0x32: 50,

0x33: 51,

0x34: 52,

0x35: 53,

0x36: 54,

0x37: 55,

0x38: 56,

0x39: 57,

0x3A: 58,

0x3B: 59,

0x3C: 60,

0x3D: 61,

0x3E: 62,

0x3F: 63,

0x40: 64,

0x41: 65,

0x42: 66,

0x43: 67,

0x44: 68,

0x45: 69,

0x46: 70,

0x47: 71,

0x48: 72,

0x49: 73,

0x4A: 74,

0x4B: 75,

0x4C: 76,

0x4D: 77,

0x4E: 78,

0x4F: 79,

0x50: 80,

0x51: 81,

0x52: 82,

0x53: 83,

0x54: 84,

0x55: 85,

0x56: 86,

0x57: 87,

0x58: 88,

0x59: 89,

0x5A: 90,

0x5B: 91,

0x5C: 92,

0x5D: 93,

0x5E: 94,

0x5F: 95,

0x60: 96,

0x61: 97,

0x62: 98,

0x63: 99,

0x64: 100,

0x65: 101,

0x66: 102,

0x67: 103,

0x68: 104,

0x69: 105,

0x6A: 106,

0x6B: 107,

0x6C: 108,

0x6D: 109,

0x6E: 110,

0x6F: 111,

0x70: 112,

0x71: 113,

0x72: 114,

0x73: 115,

0x74: 116,

0x75: 117,

0x76: 118,

0x77: 119,

0x78: 120,

0x79: 121,

0x7A: 122,

0x7B: 123,

0x7C: 124,

0x7D: 125,

0x7E: 126,

0x7F: 127,

0x80: 128,

0x81: 129,

0x82: 130,

0x83: 131,

0x84: 132,

0x85: 133,

0x86: 134,

0x87: 135,

0x88: 136,

0x89: 137,

0x8A: 138,

0x8B: 139,

0x8C: 140,

0x8D: 141,

0x8E: 142,

0x8F: 143,

0x90: 144,

0x91: 145,

0x92: 146,

0x93: 147,

0x94: 148,

0x95: 149,

0x96: 150,

0x97: 151,

0x98: 152,

0x99: 153,

0x9A: 154,

0x9B: 155,

0x9C: 156,

0x9D: 157,

0x9E: 158,

0x9F: 159,

0xA0: 160,

0xA1: 161,

0xA2: 162,

0xA3: 163,

0xA4: 164,

0xA5: 165,

0xA6: 166,

0xA7: 167,

0xA8: 168,

0xA9: 169,

0xAA: 170,

0xAB: 171,

0xAC: 172,

0xAD: 173,

0xAE: 174,

0xAF: 175,

0xB0: 176,

0xB1: 177,

0xB2: 178,

0xB3: 179,

0xB4: 180,

0xB5: 181,

0xB6: 182,

0xB7: 183,

0xB8: 184,

0xB9: 185,

0xBA: 186,

0xBB: 187,

0xBC: 188,

0xBD: 189,

0xBE: 190,

0xBF: 191,

0xC0: 192,

0xC1: 193,

0xC2: 194,

0xC3: 195,

0xC4: 196,

0xC5: 197,

0xC6: 198,

0xC7: 199,

0xC8: 200,

0xC9: 201,

0xCA: 202,

0xCB: 203,

0xCC: 204,

0xCD: 205,

0xCE: 206,

0xCF: 207,

0xD0: 208,

0xD1: 209,

0xD2: 210,

0xD3: 211,

0xD4: 212,

0xD5: 213,

0xD6: 214,

0xD7: 215,

0xD8: 216,

0xD9: 217,

0xDA: 218,

0xDB: 219,

0xDC: 220,

0xDD: 221,

0xDE: 222,

0xDF: 223,

0xE0: 224,

0xE1: 225,

0xE2: 226,

0xE3: 227,

0xE4: 228,

0xE5: 229,

0xE6: 230,

0xE7: 231,

0xE8: 232,

0xE9: 233,

0xEA: 234,

0xEB: 235,

0xEC: 236,

0xED: 237,

0xEE: 238,

0xEF: 239,

0xF0: 240,

0xF1: 241,

0xF2: 242,

0xF3: 243,

0xF4: 244,

0xF5: 245,

0xF6: 246,

0xF7: 247,

0xF8: 248,

0xF9: 249,

0xFA: 250,

0xFB: 251,

0xFC: 252,

0xFD: 253,

0xFE: 254,

0xFF: 255,

}

func hex2int(hexB *[]byte) uint64 {

var retInt uint64

hexLen := len(*hexB)

for k, v := range *hexB {

retInt += b2m_map[v] * exponent(16, uint64(2*(hexLen-k-1)))

}

return retInt

}

func exponent(a, n uint64) uint64 {

result := uint64(1)

for i := n; i > 0; i >>= 1 {

if i&1 != 0 {

result *= a

}

a *= a

}

return result

}

经过测试,性能和自带的方法接近,略有提升。

goos: windows

goarch: amd64

pkg: benchmark

Benchmark_General-4 10000000 144 ns/op

Benchmark_Better-4 10000000 128 ns/op

PASS

ok benchmark 3.086s

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。

以上是 golang 将[]byte转成16进制的实现 的全部内容, 来源链接: utcz.com/z/345944.html

回到顶部