golang 将[]byte转成16进制的实现
将[]byte转成16进制
import"crypto/md5" import"fmt" sign:=md5.Sum([]byte("datestring")) signStr:=fmt.Sprintf("%x",sign)//将[]byte转成16进制
补充:golang[]byte存储存储的16进制转10进制
项目中有用[]byte存储16进制需要转到10进制,如果用系统自带的函数处理,需要先将[]byte通过hex.EncodeToString转为string,再用strconv.ParseInt转到10进制,过程中由于两次转换导致内存分配过多(每秒执行近100w次),GC出现错误导致进程挂掉。
自己写了一个函数来转,主要是避免出现内存泄漏:
varb2m_mapmap[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, } funchex2int(hexB*[]byte)uint64{ varretIntuint64 hexLen:=len(*hexB) fork,v:=range*hexB{ retInt+=b2m_map[v]*exponent(16,uint64(2*(hexLen-k-1))) } returnretInt } funcexponent(a,nuint64)uint64{ result:=uint64(1) fori:=n;i>0;i>>=1{ ifi&1!=0{ result*=a } a*=a } returnresult }
经过测试,性能和自带的方法接近,略有提升。
goos:windows goarch:amd64 pkg:benchmark Benchmark_General-4 10000000 144ns/op Benchmark_Better-4 10000000 128ns/op PASS ok benchmark 3.086s
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。