func (j *JA3) GetJA3ByteString() []byte {
	if j.ja3ByteString == nil {
		j.marshalJA3()
	}
	return j.ja3ByteString
}
GetJA3ByteString returns the JA3 string as a byte slice for more efficient handling. This function uses caching, so
repeated calls to this function on the same JA3 object will not trigger any new calculations.
package ja3
import (
	"crypto/md5"
	"encoding/hex"
)
type JA3 struct {
	version         uint16
	cipherSuites    []uint16
	extensions      []uint16
	ellipticCurves  []uint16
	ellipticCurvePF []uint8
	sni             []byte
	ja3ByteString   []byte
	ja3Hash         string
}
func ComputeJA3FromSegment(payload []byte) (*JA3, error) {
	ja3 := JA3{}
	err := ja3.parseSegment(payload)
	return &ja3, err
}