pragma solidity ^0.4.0;
contract IO {
// 一个字符串,字母表,150个字符
bytes constant ALPHABET = "abcdefghijklmnopqrstuvwxy#$%^&*()_+[]{}|;:,./?`~abcdefghijklmnopqrstuvwxy#$%^&*()_+[]{}|;:,./?`~abcdefghijklmnopqrstuvwxy#$%^&*()_+[]{}|;:,./?`~";
// 整型转长20位的字节类型
function uintToBytes(uint v) internal constant returns (bytes20 ret) {
if (v == 0) {
// 如果是0,则返回20位的0字符串
ret = '00000000000000000000';
}
else {
while (v > 0) {
// 将ret右移位8位
// uint(ret)需要提前将ret变成整型
// / (2 ** 8)表示将结果右移位8位
// bytes20()表示返回字节类型
ret = bytes20(uint(ret) / (2 ** 8));
// v % 10得到余数
ret |= bytes20(((v % 10) + 48) * 2 ** (8 * 19));
// 除以10
v /= 10;
}
}
return ret;
}
// 得到下标
function getKey(uint k) internal constant returns(bytes20) {
return uintToBytes(k);
}
// 根据下标得到值
function getVal(uint k) internal constant returns(bytes ret) {
ret = new bytes(100);
for (uint i = 0; i < 100; i++) {
ret[i] = ALPHABET[k%50+i];
}
}
event finishWrite(uint size, uint signature);
event finishScan(uint size, uint signature);
// 全局
mapping(bytes20=>bytes) store;
// 得到值
function get(bytes20 key) constant returns(bytes) {
return store[key];
}
// 设置值
function set(bytes20 key, bytes value) {
store[key] = value;
}
// 写size次
function write(uint start_key, uint size, uint signature) {
for (uint i = 0; i < size; i++) {
set(getKey(start_key+i), getVal(start_key+i));
}
finishWrite(size, signature);
}
// 读size次
function scan(uint start_key, uint size, uint signature) {
bytes memory ret;
for (uint i = 0; i < size; i++) {
ret = get(getKey(start_key+i));
}
finishScan(size, signature);
}
// 从后往前读
function revert_scan(uint start_key, uint size, uint signature) {
bytes memory ret;
for (uint i = 0; i < size; i++) {
ret = get(getKey(start_key+size-i-1));
}
finishScan(size, signature);
}
}