スポンサーリンク

C言語で数値を16進の文字列の変換するのは、snprintf()を使えば簡単にできます。
今回は、C言語で数値を32進数表記に変換してみます。

16進数は、0からfまでで表現されます。
32進数は、0からvまでで表現します。

サンプルコード
#include <stdio.h>
#include <stdlib.h>

int
encode32(unsigned long n, char *buf, int len)
{
	// _____________________0_________1_________2_________3_
	// _____________________01234567890123456789012345678901
	const char * const d = "0123456789abcdefghijklmnopqrstuv";
	char *limit	= buf + len - 1; // -1 は \0 の分

	unsigned long	base = 32;
	char		*p = buf, *t = buf;
	char tmp;

	do
	{
		*p++ = d [ n % base ];
		if (p > limit) {
			return (-1);
		}
	}
	while (n /= base);

	*p = '\0';
	--p;

	// 文字列を逆に並べ替える
	while (t < p)
	{
		tmp = *t;
		*t++ = *p;
		*p-- = tmp;
	}
	return (0);
}

#define BUF 64

void
encode32test(unsigned long n)
{
	char buf[BUF];
	int	buflen = sizeof(buf);
	
	if (encode32(n, buf, buflen) == 0) {
		printf ("%ld => %s\n", n, buf);
	} else {
		printf ("can not encode32 %ld\n", n);
	}
}

void
encode32test_small_buffer(unsigned long n)
{
	char buf[2];
	int	buflen = sizeof(buf);
	
	if (encode32(n, buf, buflen) == 0) {
		printf ("%ld => %s\n", n, buf);
	} else {
		printf ("can not encode32 %ld\n", n);
	}
}

int
main (int argc, char *argv[])
{
	encode32test (0UL);
	encode32test (10UL);
	encode32test (16UL);
	encode32test (31UL);
	encode32test (32UL);
	encode32test (33UL);
	encode32test (34UL);
	encode32test (64UL);
	encode32test (1023UL);
	encode32test (1024UL);
	encode32test (30000UL);
	encode32test (65545UL);

	encode32test_small_buffer (31UL); // v\0 になる
	encode32test_small_buffer (32UL); // エラーのテスト 10\0 は入らない
	encode32test_small_buffer (33UL); // エラーのテスト


	exit (EXIT_SUCCESS);
}

コンパイル

cc -Wall encode32.c


実行方法

./a.out


実行結果

0 => 0
10 => a
16 => g
31 => v
32 => 10
33 => 11
34 => 12
64 => 20
1023 => vv
1024 => 100
30000 => t9g
65545 => 2009
31 => v
can not encode32 32
can not encode32 33

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー