View mode: basic / threaded / horizontal-split · Log in · Help
August 25, 2012
Reading bytes and converting to int
Hello everyone, I recently discovered the D language.
So, I want to open a file a read 4 bytes and get the int value.

string bytes = f.read(4)

I tried to cast but give me message it was deprecated.

uint value = cast (uint) bytes

If bytes was for example, "\x24\x00\x00\x00" I would like to 
value to be 0x24.
I know how to do this in Python, it is done with struct.unpack.
Thanks.
August 25, 2012
Re: Reading bytes and converting to int
On Saturday, 25 August 2012 at 15:23:45 UTC, joao wrote:
> Hello everyone, I recently discovered the D language.
> So, I want to open a file a read 4 bytes and get the int value.
>
> string bytes = f.read(4)
>
> I tried to cast but give me message it was deprecated.
>
> uint value = cast (uint) bytes
>
> If bytes was for example, "\x24\x00\x00\x00" I would like to 
> value to be 0x24.
> I know how to do this in Python, it is done with struct.unpack.
> Thanks.

Maybe std.bitmanip.peek could help?
August 25, 2012
Re: Reading bytes and converting to int
Am 25.08.2012 17:23, schrieb joao:
> Hello everyone, I recently discovered the D language.
> So, I want to open a file a read 4 bytes and get the int value.
>
> string bytes = f.read(4)
>
> I tried to cast but give me message it was deprecated.
>
> uint value = cast (uint) bytes
>
> If bytes was for example, "\x24\x00\x00\x00" I would like to value to be
> 0x24.
> I know how to do this in Python, it is done with struct.unpack.
> Thanks.

I think that is what you need/want: 
http://dlang.org/phobos/std_bitmanip.html#read
August 25, 2012
Re: Reading bytes and converting to int
On Saturday, 25 August 2012 at 15:23:45 UTC, joao wrote:
> Hello everyone, I recently discovered the D language.
> So, I want to open a file a read 4 bytes and get the int value.
>
> string bytes = f.read(4)
>
> I tried to cast but give me message it was deprecated.
>
> uint value = cast (uint) bytes
>
> If bytes was for example, "\x24\x00\x00\x00" I would like to 
> value to be 0x24.
> I know how to do this in Python, it is done with struct.unpack.
> Thanks.

auto i = cast(ubyte[])std.file.read("filename");
int val = std.bitmanip.read!(int, 
std.system.Endian.littleEndian)(i)
August 25, 2012
Re: Reading bytes and converting to int
Thanks everyone, I solved the problem.
I didn't understand these bitmanip methods so I searched and 
found a function to do what I wanted:

string b = "\x24\x10\x00\x00";
uint i = byteToInt(b);
uint byteToInt(string b) {
	 return b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24;
}

=> 4132
August 25, 2012
Re: Reading bytes and converting to int
On Saturday, August 25, 2012 21:50:58 joao wrote:
> Thanks everyone, I solved the problem.
> I didn't understand these bitmanip methods so I searched and
> found a function to do what I wanted:
> 
> string b = "\x24\x10\x00\x00";
> uint i = byteToInt(b);
> uint byteToInt(string b) {
> 	 return b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24;
> }
> 
> => 4132

What's hard to understand about them? I thought that they were very 
straightforward.

This will do essentially the same thing:

import std.bitmanip;
import std.system;

void main()
{
   ubyte[] b = [0x24, 0x10, 0x00, 0x00];
   auto i = peek!(uint, Endian.littleEndian)(b);
   assert(i == 4132);
}

Use peek if you don't want to consume the buffer and read if you do.

- Jonathan M Davis
August 25, 2012
Re: Reading bytes and converting to int
On Saturday, 25 August 2012 at 20:03:38 UTC, Jonathan M Davis 
wrote:
> On Saturday, August 25, 2012 21:50:58 joao wrote:
>> Thanks everyone, I solved the problem.
>> I didn't understand these bitmanip methods so I searched and
>> found a function to do what I wanted:
>> 
>> string b = "\x24\x10\x00\x00";
>> uint i = byteToInt(b);
>> uint byteToInt(string b) {
>> 	 return b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24;
>> }
>> 
>> => 4132
>
> What's hard to understand about them? I thought that they were 
> very
> straightforward.
>
> This will do essentially the same thing:
>
> import std.bitmanip;
> import std.system;
>
> void main()
> {
>     ubyte[] b = [0x24, 0x10, 0x00, 0x00];
>     auto i = peek!(uint, Endian.littleEndian)(b);
>     assert(i == 4132);
> }
>
> Use peek if you don't want to consume the buffer and read if 
> you do.
>
> - Jonathan M Davis

It's not hard, sorry, it's because I'm a begginner.
So, all I wanted to do was to open a file and read the first 4 
bytes and then return the int value. The last part I managed to 
do.
But the first I'm trying.

In Python it is something like this:
f = open('filename')
s = f.read(4)
...
In D I don't know yet. I'm trying to do:
File f = File('filename')
Then I want to read just 4 bytes. I still don't know what method 
is :P
August 25, 2012
Re: Reading bytes and converting to int
Am 25.08.2012 22:18, schrieb joao:
> On Saturday, 25 August 2012 at 20:03:38 UTC, Jonathan M Davis wrote:
>> On Saturday, August 25, 2012 21:50:58 joao wrote:
>>> Thanks everyone, I solved the problem.
>>> I didn't understand these bitmanip methods so I searched and
>>> found a function to do what I wanted:
>>>
>>> string b = "\x24\x10\x00\x00";
>>> uint i = byteToInt(b);
>>> uint byteToInt(string b) {
>>>      return b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24;
>>> }
>>>
>>> => 4132
>>
>> What's hard to understand about them? I thought that they were very
>> straightforward.
>>
>> This will do essentially the same thing:
>>
>> import std.bitmanip;
>> import std.system;
>>
>> void main()
>> {
>>     ubyte[] b = [0x24, 0x10, 0x00, 0x00];
>>     auto i = peek!(uint, Endian.littleEndian)(b);
>>     assert(i == 4132);
>> }
>>
>> Use peek if you don't want to consume the buffer and read if you do.
>>
>> - Jonathan M Davis
>
> It's not hard, sorry, it's because I'm a begginner.
> So, all I wanted to do was to open a file and read the first 4 bytes and
> then return the int value. The last part I managed to do.
> But the first I'm trying.
>
> In Python it is something like this:
> f = open('filename')
> s = f.read(4)
> ...
> In D I don't know yet. I'm trying to do:
> File f = File('filename')
> Then I want to read just 4 bytes. I still don't know what method is :P

File f = File("filename");
auto buf = f.rawRead(new ubyte[4]);
August 25, 2012
Re: Reading bytes and converting to int
On Saturday, August 25, 2012 22:18:50 joao wrote:
> It's not hard, sorry, it's because I'm a begginner.
> So, all I wanted to do was to open a file and read the first 4
> bytes and then return the int value. The last part I managed to
> do.
> But the first I'm trying.
> 
> In Python it is something like this:
> f = open('filename')
> s = f.read(4)
> ...
> In D I don't know yet. I'm trying to do:
> File f = File('filename')
> Then I want to read just 4 bytes. I still don't know what method
> is :P

I believe that this will work;

import std.stdio;

auto file = File("filename");
auto buffer = ubyte[](4);
buffer = file.rawRead(buffer);

rawRead will read in the type given, and it will read up to the number of 
elements given (less if the file is shorter). If the elements are ubyte, then 
the length of the array before passing it in will be the number of bytes to 
read, and the length of the result is the number of bytes read.

- Jonathan M Davis
August 25, 2012
Re: Reading bytes and converting to int
On Saturday, 25 August 2012 at 20:31:22 UTC, Jonathan M Davis 
wrote:
> On Saturday, August 25, 2012 22:18:50 joao wrote:
>> It's not hard, sorry, it's because I'm a begginner.
>> So, all I wanted to do was to open a file and read the first 4
>> bytes and then return the int value. The last part I managed to
>> do.
>> But the first I'm trying.
>> 
>> In Python it is something like this:
>> f = open('filename')
>> s = f.read(4)
>> ...
>> In D I don't know yet. I'm trying to do:
>> File f = File('filename')
>> Then I want to read just 4 bytes. I still don't know what 
>> method
>> is :P
>
> I believe that this will work;
>
> import std.stdio;
>
> auto file = File("filename");
> auto buffer = ubyte[](4);
> buffer = file.rawRead(buffer);
>
> rawRead will read in the type given, and it will read up to the 
> number of
> elements given (less if the file is shorter). If the elements 
> are ubyte, then
> the length of the array before passing it in will be the number 
> of bytes to
> read, and the length of the result is the number of bytes read.
>
> - Jonathan M Davis

Ok, so I tried both ways and gave errors:
import std.stdio, std.cstream, std.system, std.bitmanip;

File f = File("filename");
auto buf = f.rawRead(new ubyte[4]);
auto i = peek!(uint, Endian.littleEndian)(buf);

std.stdio.File conflicts with std.stream.File

and

auto file = File("filename");
auto buffer = ubyte[](4);
buffer = file.rawRead(buffer);
auto i = peek!(uint, Endian.littleEndian)(buffer);

found '[' when expecting '.' following ubyte and ']' when 
expecting identifier following 'ubyte'
« First   ‹ Prev
1 2
Top | Discussion index | About this forum | D home