首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

怎么将一个字节的数据,使用vb转换成两个ascii码

2012-02-25 
如何将一个字节的数据,使用vb转换成两个ascii码我这两天使用通讯协议分析软件(我多年前用qbasic编写的)分

如何将一个字节的数据,使用vb转换成两个ascii码
我这两天使用通讯协议分析软件(我多年前用qbasic编写的)分析了一下日本fanuc plc eprom读写器 fa-writer。发现它在读、写eprom时,将读出的eprom中的一个字节,按照高4位、低四位转换成两个相应的ascii码,从串口发送或接收。
例如:

  (hex) (ascii)
 eprom内容 发送的内容

  0A 30 41 

  14 B1 B4 '做了 parity 处理、补偶了。补偶前应为 31 34。

vb 能够将一个字节的内容转换成两个对应的ascii 吗?

任何方式的帮助,都将非常感谢!

[解决办法]
分析一下,都加了30
0 0+30 30
A 11+30 41

1 1+30 31 B1
4 4+30 34 B4


[解决办法]
不补偶的:

VB code
dim n as byte, n1 as byte, n2 as byten = &H0An1 = (n \ &H10) + &H30n2 = (n mod &H10) + &H30debug.print hex(n1), hex(n2)
[解决办法]
VB code
Public Function HexToAsc(bytHex As Byte) As String    Dim i As Long    i = bytHex \ 16    If i > 9 Then        HexToAsc = Chr(i - 10 + &H41)    Else        HexToAsc = Chr(i + &H30)    End If    i = bytHex Mod 16    If i > 9 Then        HexToAsc = HexToAsc & Chr(i - 10 + &H41)    Else        HexToAsc = HexToAsc & Chr(i + &H30)    End IfEnd FunctionPublic Function HexToAsc2(bytHex As Byte) As Byte()    Dim i As Long    Dim bytAsc(0 To 1) As Byte    i = bytHex \ 16    If i > 9 Then        bytAsc(0) = i - 10 + &H41    Else        bytAsc(0) = i + &H30    End If    i = bytHex Mod 16    If i > 9 Then        bytAsc(1) = i - 10 + &H41    Else        bytAsc(1) = i + &H30    End If    HexToAsc2 = bytAscEnd FunctionPrivate Sub Command1_Click()    Dim byt() As Byte    byt = HexToAsc2(&HD)    Print Chr(byt(0)); Chr(byt(1))End SubPrivate Sub Command2_Click()    Print HexToAsc(&HD)End Sub
[解决办法]
大家注意一下:十六进制 A = 10 ,而不是 11。

楼主试一下这段代码:
VB code
Private Function ByteToHexStr(Num As Byte) As String    Dim i%, strBH$        i = Num \ 16 + 48    If (i > 57) Then i = i + 7    strBH = Chr$(i)    i = (Num And 15) + 48    If (i > 57) Then i = i + 7    ByteToHexStr = strBH & Chr$(i)    End FunctionPrivate Sub Command1_Click()    Debug.Print ByteToHexStr(&H1A)    Debug.Print ByteToHexStr(&H35)    Debug.Print ByteToHexStr(&HEF)End Sub'输出:' 1A' 35' EF
[解决办法]
探讨
我试了chen8013的程序。可能我的问题没有问清楚?!

应该是如下内容,就满足需要了.

0-9 用 31,32,33,....39表示  A-F 用 41,42,43,44,45,46来表示 (在这里先不考虑补偶处理)

  hex        output code
  1A            31 41
  35            33 35
  EF            45 46

多谢各位!

[解决办法]
其实很简单。

它是把一个字节的内容当作字符来处理的:

0A: Asc("0") = &H30, Asc("A") = &H41

因此,不需要楼上的复杂函数,只要

Dim a() As Byte
a = StrConv(Right("0" & Hex(b), 2), vbFromUnicode)


试试:
Dim a() As Byte
Dim b As Byte

b = &HA
a = StrConv(Right("0" & Hex(b), 2), vbFromUnicode)

Debug.Print Hex(a(0))
Debug.Print Hex(a(1))


[解决办法]
Right("0" & Hex(b), 2) 是为了保证十六进制有 2 个字符。因为 Hex() 是自动去除前导 0 的:


Hex(&HA) 得到的是 "A" 而不是 "0A"。
[解决办法]
那位能用二进制给描述一下 &H0A 和 hex(&H0A) 
1. &HA = 10 
binary code( 0000 1010 ) 
2. Hex(&H0A) = "A"
binary code ( 0100 0001 ) 

[解决办法]
lz:你用VB做下试验
在CODE编辑窗口[code=VB]
Private Sub Command1_Click()
Dim a As Byte
a = &HA '书写按a = &H0A,换行后变为a = &HA
Debug.Print a
Debug.Print
End Sub
[/code]
立即窗口执行Command1_Click
可以看到:
10
A
前导零不显示.但内存的BYTE中必然是(0000 1010)

热点排行