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
}