Difference between revisions of "RawData"

From MiniScript Wiki
Jump to navigation Jump to search
(→‎Examples: + Convert string -> RawData)
 
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
The <c>RawData</c> class in [[Mini Micro]] represents a buffer of raw bytes.  Interpretation of these bytes is entirely up to the programmer.
 
The <c>RawData</c> class in [[Mini Micro]] represents a buffer of raw bytes.  Interpretation of these bytes is entirely up to the programmer.
 +
 +
See also: [[file.loadRaw]], [[file.saveRaw]]
  
 
=== Properties ===
 
=== Properties ===
Line 18: Line 20:
 
| <c>len</c> || returns the length of the raw data buffer, in bytes
 
| <c>len</c> || returns the length of the raw data buffer, in bytes
 
|-
 
|-
| <c>[[RawData.resize|resize]](bytes=32)</c> || change the size of the raw data buffer
+
| <c>[[RawData.resize|resize]](''bytes=32'')</c> || change the size of the raw data buffer
 
|-
 
|-
 
| <c>[[RawData.byte|byte]](''self, offset=0'')</c> || get one unsigned byte of data
 
| <c>[[RawData.byte|byte]](''self, offset=0'')</c> || get one unsigned byte of data
Line 28: Line 30:
 
| <c>[[RawData.setSbyte|setSbyte]](''self, offset=0, value=0'')</c> || set one signed byte value
 
| <c>[[RawData.setSbyte|setSbyte]](''self, offset=0, value=0'')</c> || set one signed byte value
 
|-
 
|-
| <c>[[RawData.ushort|ushort]](''self, offset=0'')</c> ||  
+
| <c>[[RawData.ushort|ushort]](''self, offset=0'')</c> || get an unsigned 16-bit integer value
 
|-
 
|-
| <c>[[RawData.setUshort|setUshort]](''self, offset=0, value=0'')</c> ||  
+
| <c>[[RawData.setUshort|setUshort]](''self, offset=0, value=0'')</c> || set an unsigned 16-bit integer value
 
|-
 
|-
| <c>[[RawData.short|short]](''self, offset=0'')</c> ||  
+
| <c>[[RawData.short|short]](''self, offset=0'')</c> || get a signed 16-bit integer value
 
|-
 
|-
| <c>[[RawData.setShort|setShort]](''self, offset=0, value=0'')</c> ||  
+
| <c>[[RawData.setShort|setShort]](''self, offset=0, value=0'')</c> || set a signed 16-bit integer value
 
|-
 
|-
| <c>[[RawData.uint|uint]](''self, offset=0'')</c> ||  
+
| <c>[[RawData.uint|uint]](''self, offset=0'')</c> || get an unsigned 32-bit integer value
 
|-
 
|-
| <c>[[RawData.setUint|setUint]](''self, offset=0, value=0'')</c> ||  
+
| <c>[[RawData.setUint|setUint]](''self, offset=0, value=0'')</c> || set an unsigned 32-bit integer value
 
|-
 
|-
| <c>[[RawData.int|int]](''self, offset=0'')</c> ||  
+
| <c>[[RawData.int|int]](''self, offset=0'')</c> || get a signed 32-bit integer value
 
|-
 
|-
| <c>[[RawData.setInt|setInt]](''self, offset=0, value=0'')</c> ||  
+
| <c>[[RawData.setInt|setInt]](''self, offset=0, value=0'')</c> || set a signed 32-bit integer value
 
|-
 
|-
| <c>[[RawData.float|float]](''self, offset=0'')</c> ||  
+
| <c>[[RawData.float|float]](''self, offset=0'')</c> || get a 32-bit floating-point value
 
|-
 
|-
| <c>[[RawData.setFloat|setFloat]](''self, offset=0, value=0'')</c> ||  
+
| <c>[[RawData.setFloat|setFloat]](''self, offset=0, value=0'')</c> || set a 32-bit floating-point value
 
|-
 
|-
| <c>[[RawData.double|double]](''self, offset=0'')</c> ||  
+
| <c>[[RawData.double|double]](''self, offset=0'')</c> || get a 64-bit floating-point value
 
|-
 
|-
| <c>[[RawData.setDouble|setDouble]](''self, offset=0, value=0'')</c> ||  
+
| <c>[[RawData.setDouble|setDouble]](''self, offset=0, value=0'')</c> || set a 64-bit floating-point value
 
|-
 
|-
| <c>[[RawData.utf8|utf8]](''self, offset=0, bytes=-1'')</c> ||  
+
| <c>[[RawData.utf8|utf8]](''self, offset=0, bytes=-1'')</c> || get a string of ASCII or UTF-8 text
 
|-
 
|-
| <c>[[RawData.setUtf8|setUtf8]](''self, offset=0, value=""'')</c> ||  
+
| <c>[[RawData.setUtf8|setUtf8]](''self, offset=0, value=""'')</c> || set a string as UTF-8; return number of bytes written
 
|}
 
|}
 +
 +
==== Notes ====
 +
 +
The getter and setter methods accept <c>offset</c> argument which, as with [[string]] and [[list]] indexing, may be <c>0 .. (len-1)</c> or <c>-len .. -1</c> where the negative indexes mean offset from the end of data.
 +
 +
If offset (positive or negative) is out of range, an <c>IndexError</c> is raised. Same error is raised if the span of read or written bytes go beyond the data boundaries, with the exception of <c>.setUtf8</c> that writes as much of its string value as possible and drops the rest.
 +
 +
=== Examples ===
 +
 +
<ms>
 +
r = new RawData  // Create new RawData of zero length
 +
 +
r.resize 100  // resize it before writing and reading data
 +
 +
r.setByte 42, 200
 +
 +
print r.sbyte(42)  // prints: -56
 +
</ms>
 +
 +
==== Converting a string to RawData ====
 +
 +
There's no easy way to know how big a string will be in bytes, but it should be less than (or equal to) 4 times the length.  So start with a buffer equal to 4 times s.len, and then after you setUtf8 you can get the actual byte count, and resize your rawData down to size.
 +
 +
<ms>
 +
r = new RawData
 +
 +
s = "ॐ मणि पद्मे हूँ"
 +
 +
r.resize s.len * 4
 +
 +
r.resize r.setUtf8(0, s)
 +
 +
print r.utf8 == "ॐ मणि पद्मे हूँ"  // prints: 1
 +
</ms>

Latest revision as of 10:58, 15 May 2024

The RawData class in Mini Micro represents a buffer of raw bytes. Interpretation of these bytes is entirely up to the programmer.

See also: file.loadRaw, file.saveRaw

Properties

Property Name Type Default Value Meaning
littleEndian number (boolean) true whether multi-byte values are stored with least significant byte first


Methods

Method Description
len returns the length of the raw data buffer, in bytes
resize(bytes=32) change the size of the raw data buffer
byte(self, offset=0) get one unsigned byte of data
setByte(self, offset=0, value=0) set one unsigned byte value
sbyte(self, offset=0) get one signed byte of data
setSbyte(self, offset=0, value=0) set one signed byte value
ushort(self, offset=0) get an unsigned 16-bit integer value
setUshort(self, offset=0, value=0) set an unsigned 16-bit integer value
short(self, offset=0) get a signed 16-bit integer value
setShort(self, offset=0, value=0) set a signed 16-bit integer value
uint(self, offset=0) get an unsigned 32-bit integer value
setUint(self, offset=0, value=0) set an unsigned 32-bit integer value
int(self, offset=0) get a signed 32-bit integer value
setInt(self, offset=0, value=0) set a signed 32-bit integer value
float(self, offset=0) get a 32-bit floating-point value
setFloat(self, offset=0, value=0) set a 32-bit floating-point value
double(self, offset=0) get a 64-bit floating-point value
setDouble(self, offset=0, value=0) set a 64-bit floating-point value
utf8(self, offset=0, bytes=-1) get a string of ASCII or UTF-8 text
setUtf8(self, offset=0, value="") set a string as UTF-8; return number of bytes written

Notes

The getter and setter methods accept offset argument which, as with string and list indexing, may be 0 .. (len-1) or -len .. -1 where the negative indexes mean offset from the end of data.

If offset (positive or negative) is out of range, an IndexError is raised. Same error is raised if the span of read or written bytes go beyond the data boundaries, with the exception of .setUtf8 that writes as much of its string value as possible and drops the rest.

Examples

r = new RawData  // Create new RawData of zero length

r.resize 100  // resize it before writing and reading data

r.setByte 42, 200

print r.sbyte(42)  // prints: -56

Converting a string to RawData

There's no easy way to know how big a string will be in bytes, but it should be less than (or equal to) 4 times the length. So start with a buffer equal to 4 times s.len, and then after you setUtf8 you can get the actual byte count, and resize your rawData down to size.

r = new RawData

s = "ॐ मणि पद्मे हूँ"

r.resize s.len * 4

r.resize r.setUtf8(0, s)

print r.utf8 == "ॐ मणि पद्मे हूँ"  // prints: 1