DEV Community

HarmonyOS
HarmonyOS

Posted on

After compressing data using zip.deflate, how can I obtain the length of the encoded data?

Read the original article:After compressing data using zip.deflate, how can I obtain the length of the encoded data?

Question

After compressing data with zip.deflate and calling zStream.totalOut, the totalOut value of zStream remains unchanged at 0 even after encoding. How can I obtain the length of the encoded data?

import { zlib } from '@kit.BasicServicesKit';

async function getTotalOutOfzStream() {
  let str = 'hello world!';
  let arrayBufferIn = new ArrayBuffer(str.length);
  let byteArray = new Uint8Array(arrayBufferIn);
  for (let i = 0, j = str.length; i < j; i++) {
    byteArray[i] = str.charCodeAt(i)
  }
  let arrayBufferOut = new ArrayBuffer(100);
  let zStream: zlib.ZStream = {
    nextIn: arrayBufferIn,
    availableIn: arrayBufferIn.byteLength,
    nextOut: arrayBufferOut,
    availableOut: arrayBufferOut.byteLength,
    totalOut: 0
  };
  try {
    let zip = zlib.createZipSync();
    await zip.deflateInit(zStream, zlib.CompressLevel.COMPRESS_LEVEL_BEST_SPEED)
    await zip.deflate(zStream, zlib.CompressFlushMode.FINISH)

    // Use zStream to obtain totalOut
    let totalOut = zStream.totalOut
    console.info('The total out of zStream is ' + totalOut)
  } catch (e) {
    console.error(e)
  }
}
Enter fullscreen mode Exit fullscreen mode

Short Answer

After each operation completes, you must call getZStream() again to obtain the latest status. For reference: Compression and Decompression.

 import { zlib } from '@kit.BasicServicesKit';

async function getTotalOutOfzStream() {
  let str = 'hello world!';
  let arrayBufferIn = new ArrayBuffer(str.length);
  let byteArray = new Uint8Array(arrayBufferIn);
  for (let i = 0, j = str.length; i < j; i++) {
    byteArray[i] = str.charCodeAt(i)
  }
  let arrayBufferOut = new ArrayBuffer(100);
  let zStream: zlib.ZStream = {
    nextIn: arrayBufferIn,
    availableIn: arrayBufferIn.byteLength,
    nextOut: arrayBufferOut,
    availableOut: arrayBufferOut.byteLength,
    totalOut: 0
  };
  try {
    let zip = zlib.createZipSync();
    await zip.deflateInit(zStream, zlib.CompressLevel.COMPRESS_LEVEL_BEST_SPEED)
    await zip.deflate(zStream, zlib.CompressFlushMode.FINISH)

    // Re-execute getZStream() to obtain the latest status, then get totalOut.
    let totalOut = (await zip.getZStream()).totalOut
    console.info('The total out of zStream is ' + totalOut)
  } catch (e) {
    console.error(e)
  }
}
Enter fullscreen mode Exit fullscreen mode

Applicable Scenarios

Here are the applicable scenarios for obtaining the encoded data length using totalOut:

Data Transmission Optimization

  • When sending compressed data over networks, knowing the exact compressed size allows for proper buffer allocation and efficient bandwidth utilization
  • Useful for implementing progress tracking during file uploads/downloads of compressed data

Memory Management and Buffer Allocation

  • Determining the precise size of compressed data before writing to storage or transmission
  • Avoiding overallocation of buffers by using the actual compressed size rather than estimated maximums

Data Storage Efficiency

  • When storing compressed data in databases or filesystems, using totalOut ensures only the actual compressed bytes are stored
  • Calculating compression ratios for monitoring storage optimization effectiveness

Streaming Data Processing

  • In real-time data compression pipelines, tracking compressed output size for proper chunking and processing
  • Monitoring compression performance across different data types and sizes

Resource Monitoring and Logging

  • Logging compression statistics for performance analysis and debugging
  • Monitoring system resource usage by tracking input vs output data sizes

Written by Fatih Turan Gundogdu

Top comments (0)