bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: When reading less than wanted characters, "read" does not detect NUL


From: Davide Brini
Subject: Re: When reading less than wanted characters, "read" does not detect NUL bytes
Date: Fri, 15 Jun 2018 16:03:54 +0200

On Fri, 15 Jun 2018 15:15:23 +0200, Davide Brini <address@hidden> wrote:

> So it looks like the only "reliable" way to detect NULs in the input is to
> read one character at a time.

Your explanation got me thinking, and I've come up with the following code
that seems to be slightly more efficient than reading one byte at a time,
as it allows reading bigger chunks of data in the parts where there are no
delimiters (NULs). I'm posting it in case it helps someone. Works For Me
(TM).

----------------------------------

to_read=512  # how many bytes to read at a time

while true; do

  IFS= read -d '' -r -n $to_read data

  status=$?
  length=${#data}

  # do whatever with what we got
  for ((i=0; i < length; i++)); do
    printf "Read character %02x\n" "'${data:i:1}"
  done

  # if we read less than we wanted, and it's not EOF, it means we also have
  # a delimiter
  if [ $length -lt $to_read ] && [ $status -eq 0 ]; then
    printf "Read a NUL\n"
  fi

  # exit if EOF
  if [ $status -ne 0 ]; then
    break
  fi

done

----------------------------------

Tests:

$ printf '\x00' | ./test.sh 
Read a NUL
$ printf '\x00\x00' | ./test.sh 
Read a NUL
Read a NUL
$ printf '\x00a\x00' | ./test.sh 
Read a NUL
Read character 61
Read a NUL
$ printf '' | ./test.sh 
$ printf 'abcd' | ./test.sh 
Read character 61
Read character 62
Read character 63
Read character 64
$ printf '\x001\x00\n' | ./test.sh 
Read a NUL
Read character 31
Read a NUL
Read character 0a

-- 
D.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]