如何将10进制转换成16进制

homeyone 2010-02-04 08:54:06
Public Function AsciiStringToHexString(ByVal asciiString As String) As Byte
Dim ascii() As Byte = System.Text.Encoding.Default.GetBytes(asciiString)
Dim count As Integer = ascii.Length
Dim hexArray(count - 1) As Byte
For idx As Integer = 0 To count - 1
hexArray(idx) = ascii(idx).ToString("X2")
Next
End Function

如果ascii()如果出现2E就会提示 从字符串“2E”到类型“Byte”的转换无效。
ascii()已经是Byte 的十进制,如何转换成Byte 类型的十六进制呢?
...全文
1851 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
viena 2010-02-04
  • 打赏
  • 举报
回复
还是再说一遍吧
计算机里所有的数字包括Byte,都是二进制,你看到十六进制,是为了人看得方便,十六进制与二进制存在简单对应关系,一般习惯用十六进制来表示二进制内容
viena 2010-02-04
  • 打赏
  • 举报
回复
脑残片出售,5毛一片,数量有限,售完为止~
viena 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ckp00001 的回复:]
Byte 实际就是16进制的,只不过我们通常是用10进制方式看而已(也可用16进制方式看)
例如:将你的 123 放进 一个Byte :
A_Byte = 123
再将这个A_Byte以写字节的方式写进注册表,我想就可以了吧。

[/Quote]
说了半天对牛弹琴啊,真是无奈
yuzhangqu 2010-02-04
  • 打赏
  • 举报
回复
概念不清。。。
homeyone 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ckp00001 的回复:]
不知你的注册表要用什么形式的16进制放置,如果注册表的16进制是ASCII放置的话:
       
Dim byte1() As Byte = System.Text.Encoding.ASCII.GetBytes("123.123.123.123:80")
   
        My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\YourKeys\YourKey\KeyName", "MyKey1", byte1, Microsoft.Win32.RegistryValueKind.Binary)

OK!
[/Quote]

确实可以,好奇怪啊,我记得他不是转换成10进制的吗?怎么到注册表后自动变成16进制了!
joeandlily 2010-02-04
  • 打赏
  • 举报
回复
使用计算器
ckp00001 2010-02-04
  • 打赏
  • 举报
回复
不知你的注册表要用什么形式的16进制放置,如果注册表的16进制是ASCII放置的话:

Dim byte1() As Byte = System.Text.Encoding.ASCII.GetBytes("123.123.123.123:80")

My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\YourKeys\YourKey\KeyName", "MyKey1", byte1, Microsoft.Win32.RegistryValueKind.Binary)

OK!
vrhero 2010-02-04
  • 打赏
  • 举报
回复
为什么月经贴总是这种问题?
ckp00001 2010-02-04
  • 打赏
  • 举报
回复
Byte 实际就是16进制的,只不过我们通常是用10进制方式看而已(也可用16进制方式看)
例如:将你的 123 放进 一个Byte :
A_Byte = 123
再将这个A_Byte以写字节的方式写进注册表,我想就可以了吧。
viena 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 homeyone 的回复:]
程序的需要是这样的

我需要修改二进制注册表,但是二进制注册表是十六进制方式存储的。

比如我吧 123.123.123.123:80 这个字符串转换成ASCII码
再把ASCII(十进制)转换成十六进制,这样我就可以存到注册表中去了
前提是转换完成的是Byte类型的,否则就写不到注册表去。
[/Quote]
做编程最好懂计算机原理
ASCII是字符编码,本质是数字,计算机的的数字都是二进制,没有十进制的说法
所谓十进制与十六进制,是为了人看得方便,只有输入输出的字符串才有十进制与十六进制
而十六进制与二进制有简单的一一对应,一般都是用十六进制形式来表达二进制值
ckp00001 2010-02-04
  • 打赏
  • 举报
回复
另外,你是不是要看ascii()中要是用十六进制字串是怎么样来表达的?
如果是,可以:
dim text as string = System.BitConverter.ToString(ascii).Replace("-", " ")
homeyone 2010-02-04
  • 打赏
  • 举报
回复
程序的需要是这样的

我需要修改二进制注册表,但是二进制注册表是十六进制方式存储的。

比如我吧 123.123.123.123:80 这个字符串转换成ASCII码
再把ASCII(十进制)转换成十六进制,这样我就可以存到注册表中去了
前提是转换完成的是Byte类型的,否则就写不到注册表去。
ckp00001 2010-02-04
  • 打赏
  • 举报
回复
知道编程常识的地球人都知道,将Byte转换成字符串再转成“Byte 类型的十六进制”是不可放置的:
一个Byte最多是255,用16进制表达是“FF”,
若:A_Byte=9
?
返回的是十六进制字串“9”
B_Byte=A_Byte.ToString("X") '隐式转换为十进制9

若:A_Byte=10
?A_Byte.ToString("X")
返回的是十六进制字串“A”
B_Byte=A_Byte.ToString("X") '错误!字符"A"无法隐式转换为十进制数字!

所以,若 B_Byte.ToString("X")转换出来的都是十六进制表达的数字字符串,才可以 A_Byte = B_Byte 。

呵呵!
hhhh63 2010-02-04
  • 打赏
  • 举报
回复
Dim hexArray(count - 1) As Byte 这一句有问题,换成
Dim hexArray(count - 1) As String 就好了。

另外第一行 Public Function AsciiStringToHexString(ByVal asciiString As String) As Byte
是不是也有同样的问题?
viena 2010-02-04
  • 打赏
  • 举报
回复
你的代码根本看不懂啥意思
//System.Text.Encoding.Default
进制转换怎么会扯到字符编码了?
xuqianghit 2010-02-04
  • 打赏
  • 举报
回复
下面是c语言的解决方案:可以转换成任意的进制,我想都是差啊不多的吧。O(∩_∩)O~,是在linux内核中的一段代码:
#include <stdio.h>
#include <stdlib.h>

#define ZEROPAD 1 /* pad with zero */
#define SIGN 2 /* unsigned/signed long */
#define PLUS 4 /* show plus */
#define SPACE 8 /* space if plus */
#define LEFT 16 /* left justified */
#define SPECIAL 32 /* 0x */
#define SMALL 64 /* use 'abcdef' instead of 'ABCDEF' */

#define do_div(n,base) ({ \
int __res; \
__asm__("divl %4":"=a" (n),"=d" (__res):"0" (n),"1" (0),"r" (base)); \
__res; })

static char * number(char * str, int num, int base, int size, int precision
,int type)
{
char c,sign,tmp[36];
const char *digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int i;

if (type&SMALL) digits="0123456789abcdefghijklmnopqrstuvwxyz";
if (type&LEFT) type &= ~ZEROPAD;
if (base<2 || base>36)
return 0;
c = (type & ZEROPAD) ? '0' : ' ' ;
if (type&SIGN && num<0) {
sign='-';
num = -num;
} else
sign=(type&PLUS) ? '+' : ((type&SPACE) ? ' ' : 0);
if (sign) size--;
if (type&SPECIAL)
if (base==16) size -= 2;
else if (base==8) size--;
i=0;
if (num==0)
tmp[i++]='0';
else while (num!=0)
tmp[i++]=digits[do_div(num,base)];
if (i>precision) precision=i;
size -= precision;
if (!(type&(ZEROPAD+LEFT)))
while(size-->0)
*str++ = ' ';
if (sign)
*str++ = sign;
if (type&SPECIAL)
if (base==8)
*str++ = '0';
else if (base==16) {
*str++ = '0';
*str++ = digits[33];
}
if (!(type&LEFT))
while(size-->0)
*str++ = c;
while(i<precision--)
*str++ = '0';
while(i-->0)
*str++ = tmp[i];
while(size-->0)
*str++ = ' ';
return str;
}

int main()
{
char num [10];
number (num, 100, 16, 10, 2, SMALL);

printf (num);

return 0;
}
yyz985 2010-02-04
  • 打赏
  • 举报
回复
弄清除错误行 错误原因
homeyone 2010-02-04
  • 打赏
  • 举报
回复
谢谢viena和大家!终于搞明白了!

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧