2003-06-14 01:52:21 -04:00
|
|
|
/* ====================================================================
|
2006-12-22 14:18:16 -05:00
|
|
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
contributor license agreements. See the NOTICE file distributed with
|
|
|
|
this work for additional information regarding copyright ownership.
|
|
|
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
|
|
(the "License"); you may not use this file except in compliance with
|
|
|
|
the License. You may obtain a copy of the License at
|
2004-04-09 09:05:39 -04:00
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
==================================================================== */
|
2003-06-14 01:52:21 -04:00
|
|
|
|
|
|
|
package org.apache.poi.util;
|
|
|
|
|
2003-06-30 08:29:05 -04:00
|
|
|
import java.io.*;
|
2003-06-14 01:52:21 -04:00
|
|
|
import java.util.List;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Utilities to read hex from files.
|
2008-04-06 23:02:03 -04:00
|
|
|
* TODO - move to test packages
|
2003-06-14 01:52:21 -04:00
|
|
|
*/
|
|
|
|
public class HexRead
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* This method reads hex data from a filename and returns a byte array.
|
|
|
|
* The file may contain line comments that are preceeded with a # symbol.
|
|
|
|
*
|
|
|
|
* @param filename The filename to read
|
|
|
|
* @return The bytes read from the file.
|
|
|
|
* @throws IOException If there was a problem while reading the file.
|
|
|
|
*/
|
|
|
|
public static byte[] readData( String filename ) throws IOException
|
|
|
|
{
|
|
|
|
File file = new File( filename );
|
|
|
|
FileInputStream stream = new FileInputStream( file );
|
|
|
|
try
|
|
|
|
{
|
|
|
|
return readData( stream, -1 );
|
|
|
|
}
|
|
|
|
finally
|
|
|
|
{
|
|
|
|
stream.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Same as readData(String) except that this method allows you to specify sections within
|
|
|
|
* a file. Sections are referenced using section headers in the form:
|
|
|
|
* <pre>
|
|
|
|
* [sectioname]
|
|
|
|
* </pre>
|
|
|
|
*
|
|
|
|
* @see #readData(String)
|
|
|
|
*/
|
2008-04-06 23:02:03 -04:00
|
|
|
public static byte[] readData(InputStream stream, String section ) throws IOException {
|
2009-10-08 18:29:41 -04:00
|
|
|
|
2003-06-14 01:52:21 -04:00
|
|
|
try
|
|
|
|
{
|
|
|
|
StringBuffer sectionText = new StringBuffer();
|
|
|
|
boolean inSection = false;
|
|
|
|
int c = stream.read();
|
|
|
|
while ( c != -1 )
|
|
|
|
{
|
|
|
|
switch ( c )
|
|
|
|
{
|
|
|
|
case '[':
|
|
|
|
inSection = true;
|
|
|
|
break;
|
|
|
|
case '\n':
|
|
|
|
case '\r':
|
|
|
|
inSection = false;
|
|
|
|
sectionText = new StringBuffer();
|
|
|
|
break;
|
|
|
|
case ']':
|
|
|
|
inSection = false;
|
|
|
|
if ( sectionText.toString().equals( section ) ) return readData( stream, '[' );
|
|
|
|
sectionText = new StringBuffer();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if ( inSection ) sectionText.append( (char) c );
|
|
|
|
}
|
|
|
|
c = stream.read();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
finally
|
|
|
|
{
|
|
|
|
stream.close();
|
|
|
|
}
|
|
|
|
throw new IOException( "Section '" + section + "' not found" );
|
|
|
|
}
|
2008-04-06 23:02:03 -04:00
|
|
|
public static byte[] readData( String filename, String section ) throws IOException
|
|
|
|
{
|
|
|
|
File file = new File( filename );
|
|
|
|
FileInputStream stream = new FileInputStream( file );
|
|
|
|
return readData(stream, section);
|
|
|
|
}
|
2003-06-14 01:52:21 -04:00
|
|
|
|
2016-06-13 02:12:35 -04:00
|
|
|
@SuppressWarnings("fallthrough")
|
2003-06-14 01:52:21 -04:00
|
|
|
static public byte[] readData( InputStream stream, int eofChar )
|
|
|
|
throws IOException
|
|
|
|
{
|
|
|
|
int characterCount = 0;
|
|
|
|
byte b = (byte) 0;
|
2014-11-09 12:53:10 -05:00
|
|
|
List<Byte> bytes = new ArrayList<Byte>();
|
2003-06-14 01:52:21 -04:00
|
|
|
boolean done = false;
|
|
|
|
while ( !done )
|
|
|
|
{
|
|
|
|
int count = stream.read();
|
|
|
|
char baseChar = 'a';
|
|
|
|
if ( count == eofChar ) break;
|
|
|
|
switch ( count )
|
|
|
|
{
|
|
|
|
case '#':
|
|
|
|
readToEOL( stream );
|
|
|
|
break;
|
|
|
|
case '0': case '1': case '2': case '3': case '4': case '5':
|
|
|
|
case '6': case '7': case '8': case '9':
|
|
|
|
b <<= 4;
|
|
|
|
b += (byte) ( count - '0' );
|
|
|
|
characterCount++;
|
|
|
|
if ( characterCount == 2 )
|
|
|
|
{
|
2009-10-08 18:29:41 -04:00
|
|
|
bytes.add( Byte.valueOf( b ) );
|
2003-06-14 01:52:21 -04:00
|
|
|
characterCount = 0;
|
|
|
|
b = (byte) 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'A':
|
|
|
|
case 'B':
|
|
|
|
case 'C':
|
|
|
|
case 'D':
|
|
|
|
case 'E':
|
|
|
|
case 'F':
|
|
|
|
baseChar = 'A';
|
2016-06-13 02:12:35 -04:00
|
|
|
// fall through
|
2003-06-14 01:52:21 -04:00
|
|
|
case 'a':
|
|
|
|
case 'b':
|
|
|
|
case 'c':
|
|
|
|
case 'd':
|
|
|
|
case 'e':
|
|
|
|
case 'f':
|
|
|
|
b <<= 4;
|
|
|
|
b += (byte) ( count + 10 - baseChar );
|
|
|
|
characterCount++;
|
|
|
|
if ( characterCount == 2 )
|
|
|
|
{
|
2009-10-08 18:29:41 -04:00
|
|
|
bytes.add( Byte.valueOf( b ) );
|
2003-06-14 01:52:21 -04:00
|
|
|
characterCount = 0;
|
|
|
|
b = (byte) 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case -1:
|
|
|
|
done = true;
|
|
|
|
break;
|
|
|
|
default :
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2014-11-09 12:53:10 -05:00
|
|
|
Byte[] polished = bytes.toArray( new Byte[0] );
|
2003-06-14 01:52:21 -04:00
|
|
|
byte[] rval = new byte[polished.length];
|
|
|
|
for ( int j = 0; j < polished.length; j++ )
|
|
|
|
{
|
|
|
|
rval[j] = polished[j].byteValue();
|
|
|
|
}
|
|
|
|
return rval;
|
|
|
|
}
|
|
|
|
|
2008-09-12 02:58:52 -04:00
|
|
|
static public byte[] readFromString(String data) {
|
|
|
|
try {
|
2015-09-01 17:31:02 -04:00
|
|
|
return readData(new ByteArrayInputStream( data.getBytes(StringUtil.UTF8) ), -1);
|
2008-09-12 02:58:52 -04:00
|
|
|
} catch (IOException e) {
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
}
|
2003-06-30 08:29:05 -04:00
|
|
|
}
|
|
|
|
|
2003-06-14 01:52:21 -04:00
|
|
|
static private void readToEOL( InputStream stream ) throws IOException
|
|
|
|
{
|
|
|
|
int c = stream.read();
|
|
|
|
while ( c != -1 && c != '\n' && c != '\r' )
|
|
|
|
{
|
|
|
|
c = stream.read();
|
|
|
|
}
|
|
|
|
}
|
2004-04-09 09:05:39 -04:00
|
|
|
}
|