func CpcSketchToString()

in cpc/utils.go [847:1165]


func CpcSketchToString(mem []byte, detail bool) (string, error) {
	LS := "\n"
	capBytes := len(mem)

	// Low preamble fields (first 8 bytes)
	preInts := int(mem[loFieldPreInts]) & 0xFF
	serVerVal := int(mem[loFieldSerVer]) & 0xFF
	family := getFamilyId(mem)
	lgK := int(mem[loFieldLgK]) & 0xFF
	fiCol := int(mem[loFieldFiCol]) & 0xFF
	flags := int(mem[loFieldFlags]) & 0xFF
	seedHash := int(binary.LittleEndian.Uint16(mem[loFieldSeedHash:]))
	seedHashStr := fmt.Sprintf("%x", seedHash)

	flagsStr := zeroPad(fmt.Sprintf("%b", flags), 8) + ", " + fmt.Sprintf("%d", flags)
	bigEndian := (flags & bigEndianFlagMask) > 0
	compressed := (flags & compressedFlagMask) > 0
	hasHipVal := (flags & hipFlagMask) > 0
	hasSVVal := (flags & supValFlagMask) > 0
	hasWindowVal := (flags & windowFlagMask) > 0

	formatOrdinal := (flags >> 2) & 0x7
	format := CpcFormat(formatOrdinal)
	nativeOrderStr := "LittleEndian"

	var numCoupons, numSv, winOffset, svLengthInts, wLengthInts int64
	var kxp, hipAccum float64
	var svStreamStart, wStreamStart int64
	var reqBytes int64

	sb := &strings.Builder{}
	sb.WriteString(LS)
	sb.WriteString("### CPC SKETCH IMAGE - PREAMBLE:" + LS)
	sb.WriteString(fmt.Sprintf("Format                          : %s%s", format.String(), LS))
	sb.WriteString(fmt.Sprintf("Byte 0: Preamble Ints           : %d%s", preInts, LS))
	sb.WriteString(fmt.Sprintf("Byte 1: SerVer                  : %d%s", serVerVal, LS))
	sb.WriteString(fmt.Sprintf("Byte 2: Family                  : %d%s", family, LS))
	sb.WriteString(fmt.Sprintf("Byte 3: lgK                     : %d%s", lgK, LS))
	sb.WriteString(fmt.Sprintf("Byte 4: First Interesting Col   : %d%s", fiCol, LS))
	sb.WriteString(fmt.Sprintf("Byte 5: Flags                   : %s%s", flagsStr, LS))
	sb.WriteString(fmt.Sprintf("  BIG_ENDIAN_STORAGE            : %t%s", bigEndian, LS))
	sb.WriteString(fmt.Sprintf("  (Native Byte Order)           : %s%s", nativeOrderStr, LS))
	sb.WriteString(fmt.Sprintf("  Compressed                    : %t%s", compressed, LS))
	sb.WriteString(fmt.Sprintf("  Has HIP                       : %t%s", hasHipVal, LS))
	sb.WriteString(fmt.Sprintf("  Has Surprising Values         : %t%s", hasSVVal, LS))
	sb.WriteString(fmt.Sprintf("  Has Window Values             : %t%s", hasWindowVal, LS))
	sb.WriteString(fmt.Sprintf("Byte 6, 7: Seed Hash            : %s%s", seedHashStr, LS))

	var flavor string
	switch format {
	case CpcFormatEmptyMerged, CpcFormatEmptyHip:
		flavor = determineFlavor(lgK, uint64(numCoupons)).String()
		sb.WriteString(fmt.Sprintf("Flavor                          : %s%s", flavor, LS))
	case CpcFormatSparseHybridMerged:
		// NUM_COUPONS
		offset, err := getHiFieldOffset(format, hiFieldNumCoupons)
		if err != nil {
			return "", err
		}
		numCoupons = int64(binary.LittleEndian.Uint32(mem[offset:]))
		numSv = numCoupons

		// SV_LENGTH_INTS
		offset, err = getHiFieldOffset(format, hiFieldSVLengthInts)
		if err != nil {
			return "", err
		}
		svLengthInts = int64(binary.LittleEndian.Uint32(mem[offset:]))

		// SV Stream offset
		offset, err = getSvStreamOffset(mem)
		if err != nil {
			return "", err
		}
		svStreamStart = int64(offset)
		reqBytes = svStreamStart + (svLengthInts << 2)
		flavor = determineFlavor(lgK, uint64(numCoupons)).String()
		sb.WriteString(fmt.Sprintf("Flavor                          : %s%s", flavor, LS))
		sb.WriteString(fmt.Sprintf("Num Coupons                     : %d%s", numCoupons, LS))
		sb.WriteString(fmt.Sprintf("Num SV                          : %d%s", numSv, LS))
		sb.WriteString(fmt.Sprintf("SV Length Ints                  : %d%s", svLengthInts, LS))
		sb.WriteString(fmt.Sprintf("SV Stream Start                 : %d%s", svStreamStart, LS))
	case CpcFormatSparseHybridHip:
		offset, err := getHiFieldOffset(format, hiFieldNumCoupons)
		if err != nil {
			return "", err
		}
		numCoupons = int64(binary.LittleEndian.Uint32(mem[offset:]))
		numSv = numCoupons

		offset, err = getHiFieldOffset(format, hiFieldSVLengthInts)
		if err != nil {
			return "", err
		}
		svLengthInts = int64(binary.LittleEndian.Uint32(mem[offset:]))

		offset, err = getSvStreamOffset(mem)
		if err != nil {
			return "", err
		}
		svStreamStart = int64(offset)

		offset, err = getHiFieldOffset(format, hiFieldKXP)
		if err != nil {
			return "", err
		}
		kxp = math.Float64frombits(binary.LittleEndian.Uint64(mem[offset:]))

		offset, err = getHiFieldOffset(format, hiFieldHipAccum)
		if err != nil {
			return "", err
		}
		hipAccum = math.Float64frombits(binary.LittleEndian.Uint64(mem[offset:]))

		reqBytes = svStreamStart + (svLengthInts << 2)
		flavor = determineFlavor(lgK, uint64(numCoupons)).String()
		sb.WriteString(fmt.Sprintf("Flavor                          : %s%s", flavor, LS))
		sb.WriteString(fmt.Sprintf("Num Coupons                     : %d%s", numCoupons, LS))
		sb.WriteString(fmt.Sprintf("Num SV                          : %d%s", numSv, LS))
		sb.WriteString(fmt.Sprintf("SV Length Ints                  : %d%s", svLengthInts, LS))
		sb.WriteString(fmt.Sprintf("SV Stream Start                 : %d%s", svStreamStart, LS))
		sb.WriteString(fmt.Sprintf("KxP                             : %f%s", kxp, LS))
		sb.WriteString(fmt.Sprintf("HipAccum                        : %f%s", hipAccum, LS))
	case CpcFormatPinnedSlidingMergedNosv:
		offset, err := getHiFieldOffset(format, hiFieldNumCoupons)
		if err != nil {
			return "", err
		}
		numCoupons = int64(binary.LittleEndian.Uint32(mem[offset:]))
		winOffset = int64(determineCorrectOffset(lgK, uint64(numCoupons)))

		offset, err = getHiFieldOffset(format, hiFieldWLengthInts)
		if err != nil {
			return "", err
		}
		wLengthInts = int64(binary.LittleEndian.Uint32(mem[offset:]))

		offset, err = getWStreamOffset(mem)
		if err != nil {
			return "", err
		}
		wStreamStart = int64(offset)

		reqBytes = wStreamStart + (wLengthInts << 2)
		flavor = determineFlavor(lgK, uint64(numCoupons)).String()
		sb.WriteString(fmt.Sprintf("Flavor                          : %s%s", flavor, LS))
		sb.WriteString(fmt.Sprintf("Num Coupons                     : %d%s", numCoupons, LS))
		sb.WriteString(fmt.Sprintf("Window Offset                   : %d%s", winOffset, LS))
		sb.WriteString(fmt.Sprintf("Window Length Ints              : %d%s", wLengthInts, LS))
		sb.WriteString(fmt.Sprintf("Window Stream Start             : %d%s", wStreamStart, LS))
	case CpcFormatPinnedSlidingHipNosv:
		offset, err := getHiFieldOffset(format, hiFieldNumCoupons)
		if err != nil {
			return "", err
		}
		numCoupons = int64(binary.LittleEndian.Uint32(mem[offset:]))
		winOffset = int64(determineCorrectOffset(lgK, uint64(numCoupons)))

		offset, err = getHiFieldOffset(format, hiFieldWLengthInts)
		if err != nil {
			return "", err
		}
		wLengthInts = int64(binary.LittleEndian.Uint32(mem[offset:]))

		offset, err = getWStreamOffset(mem)
		if err != nil {
			return "", err
		}
		wStreamStart = int64(offset)

		offset, err = getHiFieldOffset(format, hiFieldKXP)
		if err != nil {
			return "", err
		}
		kxp = math.Float64frombits(binary.LittleEndian.Uint64(mem[offset:]))

		offset, err = getHiFieldOffset(format, hiFieldHipAccum)
		if err != nil {
			return "", err
		}
		hipAccum = math.Float64frombits(binary.LittleEndian.Uint64(mem[offset:]))

		reqBytes = wStreamStart + (wLengthInts << 2)
		flavor = determineFlavor(lgK, uint64(numCoupons)).String()
		sb.WriteString(fmt.Sprintf("Flavor                          : %s%s", flavor, LS))
		sb.WriteString(fmt.Sprintf("Num Coupons                     : %d%s", numCoupons, LS))
		sb.WriteString(fmt.Sprintf("Window Offset                   : %d%s", winOffset, LS))
		sb.WriteString(fmt.Sprintf("Window Length Ints              : %d%s", wLengthInts, LS))
		sb.WriteString(fmt.Sprintf("Window Stream Start             : %d%s", wStreamStart, LS))
		sb.WriteString(fmt.Sprintf("KxP                             : %f%s", kxp, LS))
		sb.WriteString(fmt.Sprintf("HipAccum                        : %f%s", hipAccum, LS))
	case CpcFormatPinnedSlidingMerged:
		offset, err := getHiFieldOffset(format, hiFieldNumCoupons)
		if err != nil {
			return "", err
		}
		numCoupons = int64(binary.LittleEndian.Uint32(mem[offset:]))
		winOffset = int64(determineCorrectOffset(lgK, uint64(numCoupons)))

		offset, err = getHiFieldOffset(format, hiFieldWLengthInts)
		if err != nil {
			return "", err
		}
		wLengthInts = int64(binary.LittleEndian.Uint32(mem[offset:]))

		offset, err = getHiFieldOffset(format, hiFieldNumSV)
		if err != nil {
			return "", err
		}
		numSv = int64(binary.LittleEndian.Uint32(mem[offset:]))

		offset, err = getHiFieldOffset(format, hiFieldSVLengthInts)
		if err != nil {
			return "", err
		}
		svLengthInts = int64(binary.LittleEndian.Uint32(mem[offset:]))

		offset, err = getWStreamOffset(mem)
		if err != nil {
			return "", err
		}
		wStreamStart = int64(offset)

		offset, err = getSvStreamOffset(mem)
		if err != nil {
			return "", err
		}
		svStreamStart = int64(offset)

		reqBytes = svStreamStart + (svLengthInts << 2)
		flavor = determineFlavor(lgK, uint64(numCoupons)).String()
		sb.WriteString(fmt.Sprintf("Flavor                          : %s%s", flavor, LS))
		sb.WriteString(fmt.Sprintf("Num Coupons                     : %d%s", numCoupons, LS))
		sb.WriteString(fmt.Sprintf("Num SV                          : %d%s", numSv, LS))
		sb.WriteString(fmt.Sprintf("SV Length Ints                  : %d%s", svLengthInts, LS))
		sb.WriteString(fmt.Sprintf("SV Stream Start                 : %d%s", svStreamStart, LS))
		sb.WriteString(fmt.Sprintf("Window Offset                   : %d%s", winOffset, LS))
		sb.WriteString(fmt.Sprintf("Window Length Ints              : %d%s", wLengthInts, LS))
		sb.WriteString(fmt.Sprintf("Window Stream Start             : %d%s", wStreamStart, LS))
	case CpcFormatPinnedSlidingHip:
		offset, err := getHiFieldOffset(format, hiFieldNumCoupons)
		if err != nil {
			return "", err
		}
		numCoupons = int64(binary.LittleEndian.Uint32(mem[offset:]))
		winOffset = int64(determineCorrectOffset(lgK, uint64(numCoupons)))

		offset, err = getHiFieldOffset(format, hiFieldWLengthInts)
		if err != nil {
			return "", err
		}
		wLengthInts = int64(binary.LittleEndian.Uint32(mem[offset:]))

		offset, err = getHiFieldOffset(format, hiFieldNumSV)
		if err != nil {
			return "", err
		}
		numSv = int64(binary.LittleEndian.Uint32(mem[offset:]))

		offset, err = getHiFieldOffset(format, hiFieldSVLengthInts)
		if err != nil {
			return "", err
		}
		svLengthInts = int64(binary.LittleEndian.Uint32(mem[offset:]))

		offset, err = getWStreamOffset(mem)
		if err != nil {
			return "", err
		}
		wStreamStart = int64(offset)

		offset, err = getSvStreamOffset(mem)
		if err != nil {
			return "", err
		}
		svStreamStart = int64(offset)

		offset, err = getHiFieldOffset(format, hiFieldKXP)
		if err != nil {
			return "", err
		}
		kxp = math.Float64frombits(binary.LittleEndian.Uint64(mem[offset:]))

		offset, err = getHiFieldOffset(format, hiFieldHipAccum)
		if err != nil {
			return "", err
		}
		hipAccum = math.Float64frombits(binary.LittleEndian.Uint64(mem[offset:]))
		reqBytes = svStreamStart + (svLengthInts << 2)
		flavor = determineFlavor(lgK, uint64(numCoupons)).String()
		sb.WriteString(fmt.Sprintf("Flavor                          : %s%s", flavor, LS))
		sb.WriteString(fmt.Sprintf("Num Coupons                     : %d%s", numCoupons, LS))
		sb.WriteString(fmt.Sprintf("Num SV                          : %d%s", numSv, LS))
		sb.WriteString(fmt.Sprintf("SV Length Ints                  : %d%s", svLengthInts, LS))
		sb.WriteString(fmt.Sprintf("SV Stream Start                 : %d%s", svStreamStart, LS))
		sb.WriteString(fmt.Sprintf("Window Offset                   : %d%s", winOffset, LS))
		sb.WriteString(fmt.Sprintf("Window Length Ints              : %d%s", wLengthInts, LS))
		sb.WriteString(fmt.Sprintf("Window Stream Start             : %d%s", wStreamStart, LS))
		sb.WriteString(fmt.Sprintf("KxP                             : %f%s", kxp, LS))
		sb.WriteString(fmt.Sprintf("HipAccum                        : %f%s", hipAccum, LS))
	}

	sb.WriteString(fmt.Sprintf("Actual Bytes                    : %d%s", capBytes, LS))
	sb.WriteString(fmt.Sprintf("Required Bytes                  : %d%s", reqBytes, LS))

	if detail {
		sb.WriteString(LS + "### CPC SKETCH IMAGE - DATA" + LS)
		if wLengthInts > 0 {
			sb.WriteString(LS + "Window Stream:" + LS)
			listData(mem, int(wStreamStart), int(wLengthInts), sb)
		}
		if svLengthInts > 0 {
			sb.WriteString(LS + "SV Stream:" + LS)
			listData(mem, int(svStreamStart), int(svLengthInts), sb)
		}
	}
	sb.WriteString("### END CPC SKETCH IMAGE" + LS)
	return sb.String(), nil
}