[Solved] Read Memory Stream form findTableFile?

Want Cheat Engine to do something specific and no idea how to do that, ask here. (From simple scripts to full trainers and extensions)
Post Reply
Speedwagonz
Noobzor
Noobzor
Posts: 13
Joined: Thu Mar 02, 2017 11:15 pm
Reputation: 0

[Solved] Read Memory Stream form findTableFile?

Post by Speedwagonz »

I'm am trying to read a table file, right now I just save it to disc then read file as normal, but how do I read the memory stream directly?
Last edited by STN on Thu Feb 10, 2022 11:13 pm, edited 2 times in total.

UltimatePoto42
Expert Cheater
Expert Cheater
Posts: 103
Joined: Tue May 02, 2017 6:00 am
Reputation: 15

Re: Read Memory Stream form findTableFile?

Post by UltimatePoto42 »

So kinda figured it out

Code: Select all

local file = findTableFile('test.cea')

local lst = getPropertyList(file)
for i = 1, lst.Count - 1 do
	print(lst[i])
end

local stream = file.getData()
print(stream)

local bytes = stream.read(stream.Size)
for i = 1, #bytes do
	print(bytes[i], string.char(bytes[i]))
end
Gives me this output:

Code: Select all


stream 
0EBD9B90 
47 / 
47 / 
47 / 
47 / 
32   
67 C 
69 E 
65 A 
32   
116 t 
101 e 
115 s 
116 t 
32   
102 f 
105 i 
108 l 
101 e 
13 
 
10 
 
So I think this is the start of what I needed.

panraven
Table Makers
Table Makers
Posts: 129
Joined: Fri Mar 03, 2017 12:03 am
Reputation: 118

Re: Read Memory Stream form findTableFile?

Post by panraven »

The returned byte table can be convert to string with ce function byteTableToString
eg.

Code: Select all

local bytes = stream.read(stream.Size)
local str = byteTableToString(bytes)
or use a stringStream which need not create intermediate Lua byte table (for performance?).

Code: Select all

function GetTableFileAsString(tfName)
  local tf = findTableFile(tfName)
  if tf then
    local ss = createStringStream()
    ss.copyFrom(tf.Stream,tf.Stream.Size)
    local ret = ss.DataString
    ss.Destroy()
    return ret
  end
end
print(GetTableFileAsString("insert-table-file-name"))
ps: if DB make .DataString work with MemoryStream, it will be just a property instead of custom function.

bye~

UltimatePoto42
Expert Cheater
Expert Cheater
Posts: 103
Joined: Tue May 02, 2017 6:00 am
Reputation: 15

Re: Read Memory Stream form findTableFile?

Post by UltimatePoto42 »

Thank you that's much nicer than what I had.

UltimatePoto42
Expert Cheater
Expert Cheater
Posts: 103
Joined: Tue May 02, 2017 6:00 am
Reputation: 15

Re: Read Memory Stream form findTableFile?

Post by UltimatePoto42 »

hum..

This is what I had not sure which is cleaner..

Code: Select all

local stream = tableFile.getData()
local fileStr = nil
local bytes = stream.read(stream.Size)
for i = 1, #bytes do
	if fileStr == nil then
		fileStr = ''
	end
	fileStr = fileStr .. string.char(bytes[i])
end
EDIT:
Ended up using yours..

Code: Select all

if tableFile then
	local ss = createStringStream()
	ss.copyFrom(tableFile.Stream,tableFile.Stream.Size)
	local fileStr = ss.DataString
	ss.Destroy()
end
Definitely looks better!
Last edited by TimFun13 on Sat Mar 04, 2017 8:44 am, edited 1 time in total.

UltimatePoto42
Expert Cheater
Expert Cheater
Posts: 103
Joined: Tue May 02, 2017 6:00 am
Reputation: 15

Re: Read Memory Stream form findTableFile?

Post by UltimatePoto42 »

Though I think mine has places to fail.

Now Do I need to destroy the stream, I wouldn't think so, but if the stream is just some copy of the file memory then I mite need to?

I ask because of the destroy call on the return from createStringStream.

Eric
Hall of Famer
Hall of Famer
Posts: 174
Joined: Thu Mar 02, 2017 11:01 pm
Reputation: 90

Re: Read Memory Stream form findTableFile?

Post by Eric »

the stringstream is a different object than the tablefile. It just contains a copy after you made the copy, so you're free to destroy it

Post Reply

Who is online

Users browsing this forum: No registered users