Thread overview
Reading hexidecimal from a file
Sep 10, 2016
Neurone
Sep 10, 2016
Basile B.
Sep 10, 2016
Basile B.
Sep 10, 2016
rikki cattermole
Sep 10, 2016
Basile B.
September 10, 2016
Hi,

I want to read a text file that contains sha1 hashes in hexidecimal, then convert the hashes back into ubyte[20]. Examples of some lines:
E9785DC5  D43B5F67  F1B7D1CB  33279B7C  284E2593
04150E8F  1840BCA2  972BE1C5  2DE81039  0C486F9C

How can I do this? The documentation for format strings is pretty dense, so couldn't understand most of it.
September 10, 2016
On Saturday, 10 September 2016 at 12:04:08 UTC, Neurone wrote:
> Hi,
>
> I want to read a text file that contains sha1 hashes in hexidecimal, then convert the hashes back into ubyte[20]. Examples of some lines:
> E9785DC5  D43B5F67  F1B7D1CB  33279B7C  284E2593
> 04150E8F  1840BCA2  972BE1C5  2DE81039  0C486F9C
>
> How can I do this? The documentation for format strings is pretty dense, so couldn't understand most of it.

at compile time you can do:

import std.conv;
enum array = hexString!(import(theFile));

the run-time version was proposed (https://github.com/dlang/phobos/pull/4487) but not interesting enough ;)
September 10, 2016
On Saturday, 10 September 2016 at 12:12:28 UTC, Basile B. wrote:
> On Saturday, 10 September 2016 at 12:04:08 UTC, Neurone wrote:
>> Hi,
>>
>> I want to read a text file that contains sha1 hashes in hexidecimal, then convert the hashes back into ubyte[20]. Examples of some lines:
>> E9785DC5  D43B5F67  F1B7D1CB  33279B7C  284E2593
>> 04150E8F  1840BCA2  972BE1C5  2DE81039  0C486F9C
>>
>> How can I do this? The documentation for format strings is pretty dense, so couldn't understand most of it.
>
> at compile time you can do:
>
> import std.conv;
> enum array = hexString!(import(theFile));
>
> the run-time version was proposed (https://github.com/dlang/phobos/pull/4487) but not interesting enough ;)

No actually, it has nothing to do with you question!

what you have to do is probably:

split join chunck(2) to!ubyte

sorry leaving now.
September 11, 2016
On 11/09/2016 12:18 AM, Basile B. wrote:
> On Saturday, 10 September 2016 at 12:12:28 UTC, Basile B. wrote:
>> On Saturday, 10 September 2016 at 12:04:08 UTC, Neurone wrote:
>>> Hi,
>>>
>>> I want to read a text file that contains sha1 hashes in hexidecimal,
>>> then convert the hashes back into ubyte[20]. Examples of some lines:
>>> E9785DC5  D43B5F67  F1B7D1CB  33279B7C  284E2593
>>> 04150E8F  1840BCA2  972BE1C5  2DE81039  0C486F9C
>>>
>>> How can I do this? The documentation for format strings is pretty
>>> dense, so couldn't understand most of it.
>>
>> at compile time you can do:
>>
>> import std.conv;
>> enum array = hexString!(import(theFile));
>>
>> the run-time version was proposed
>> (https://github.com/dlang/phobos/pull/4487) but not interesting enough ;)
>
> No actually, it has nothing to do with you question!
>
> what you have to do is probably:
>
> split join chunck(2) to!ubyte
>
> sorry leaving now.

Actually you'd want to filter out e.g. white space as well.
So the long form via an input range would be:

struct GetHex(T) {
	string from;
	T next;
	
	this(string input) {
		from = input;
		popFront;
	}
	
	@property {
		bool empty() { return from.length == 0 || next == 0; }
		
		T front() { return next; }
	}
	
	void popFront() {
		next = 0;
		
		char[T.sizeof * 2] got;
		ubyte count;
		
		while(count < got.length && from.length > 0) {
			got[count] = nextChar;
			if (got[count] != 0)
				count++;
		}

		import std.conv : parse;
		if (count > 0) {
			char[] temp = got[0 .. count];
			next = parse!T(temp, 16);
		}
	}
	
	char nextChar() {
		char readIn = from[0];
		from = from[1 .. $];
		
		if ((readIn >= 'A' && readIn <= 'F') || (readIn >= 'a' && readIn <= 'f'))
			return readIn;
		else if (readIn >= '0' && readIn <= '9')
			return readIn;
		else
			return 0;
	}
}

void main() {
	string source = "
E9785DC5  D43B5F67  F1B7D1CB  33279B7C  284E2593
04150E8F  1840BCA2  972BE1C5  2DE81039  0C486F9C";
	import std.stdio : writeln;
	
	writeln(GetHex!uint(source));
}
September 10, 2016
On Saturday, 10 September 2016 at 12:18:22 UTC, Basile B. wrote:
> On Saturday, 10 September 2016 at 12:12:28 UTC, Basile B. wrote:
>> On Saturday, 10 September 2016 at 12:04:08 UTC, Neurone wrote:
>>> Hi,
>>>
>>> I want to read a text file that contains sha1 hashes in hexidecimal, then convert the hashes back into ubyte[20]. Examples of some lines:
>>> E9785DC5  D43B5F67  F1B7D1CB  33279B7C  284E2593
>>> 04150E8F  1840BCA2  972BE1C5  2DE81039  0C486F9C
>>>
>>> How can I do this? The documentation for format strings is pretty dense, so couldn't understand most of it.
>>
>> at compile time you can do:
>>
>> import std.conv;
>> enum array = hexString!(import(theFile));
>>
>> the run-time version was proposed (https://github.com/dlang/phobos/pull/4487) but not interesting enough ;)
>
> No actually,

Finally i would have worked, after cast(ubyte[]) hexString(stuff).array;
fart...