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

字符串转换到结构时碰到汉字取得位数不对的有关问题(急)

2012-01-22 
字符串转换到结构时碰到汉字取得位数不对的问题(急)结构定义如下:PublicTypePack_Rsptrxtypeasstring*4交

字符串转换到结构时碰到汉字取得位数不对的问题(急)
结构定义如下:
Public   Type   Pack_Rsp
        trxtype   as   string   *   4   '交易代码
        retcode   as   string   *   6   '响应码
        source   as   string   *   2   '交易来源
        brn_no   as   string   *   6   '代号
        ope_no   as   string   *   6   '操作员号
        name   as   string   *   30   '客户姓名
        count   as   string   *   2   '本次返回条数
        rtn_ind   as   string   *   1   '标志
        app_seq   as   string   *   10   '编号
End   Type

发送来的字符串如下
Str= "1001555555AA000001000002张三                                                     20F0000000001 "
Winsock.getdata   Str
MoveMemory   ByVal   VarPtr(Pack_Rsp),   ByVal   StrPtr(Str),   bytesTotal

上面用MoveMemory时,取得的客户姓名为: "张三                                                     20 "
会多取2位,把汉字当成1位来处理了?不知道如何解决,请各位一定要帮帮忙



[解决办法]
string strTmp = "abcdefg某某某 ";
int i= System.Text.Encoding.Default.GetBytes(strTmp).Length; //漢字黨兩位
int j= strTmp.Length; // 漢字黨1位

VB不太清楚
[解决办法]
vb中的汉字占一个字节
[解决办法]
直接用mid函数好了 干吗用api呢
[解决办法]
vb中的汉字占一个字节

-------------------------------


你丫真牛
[解决办法]
楼主的结构体定义的不合理,这是vb4时的定义方法,不建议采用
[解决办法]
真好玩...

Const mLng = "0123456789 "

Const mStr = "零一二三四五六七八九 "

Private Sub Form_Click()

Print Len(mLng), LenB(mLng)
Print Len(mStr), LenB(mStr)

Print Len(mLng & mStr), LenB(mStr & mLng)

End Sub


[解决办法]
VB处理字符串使用UNICODE,而UNICODE无论对于ASCII字符还是中文字符,其长度都是相等的,因此它们在VB里都被当作1个字符长度处理(不是1个字节)。
[解决办法]
简单的说就是 unicode不管中文还是英文都2个字节
[解决办法]
奇怪,name倒是对了,显示“张三”,可后面的count等都不对了
Private Declare Sub CopyMemory Lib "kernel32 " Alias "RtlMoveMemory " (Destination As Any, Source As Any, ByVal Length As Long)
Private Type Pack_Rsp
trxtype As String * 4 '交易代码
retcode As String * 6 '响应码
Source As String * 2 '交易来源
brn_no As String * 6 '代号
ope_no As String * 6 '操作员号
name As String * 30 '客户姓名
count As String * 2 '本次返回条数
rtn_ind As String * 1 '标志


app_seq As String * 10 '编号
End Type
Private Sub Command1_Click()
Dim s$, s1 As Pack_Rsp, L As Long

s = "1001555555AA000001000002张三 20F0000000001 "
L = Len(s1)
CopyMemory ByVal VarPtr(s1), ByVal StrPtr(s), L
Debug.Print s1.name
Debug.Print s1.count
Debug.Print s1.rtn_ind
Debug.Print s1.app_seq
[解决办法]
如果对方也是自己的程序,不如这样,字符串中用空格隔开,接收到后,再用split分解
[解决办法]
Private Sub Command1_Click()
Dim s$, s1 As Pack_Rsp, L As Long

s = "1001555555AA000001000002张三 20F0000000001 "
L = LenB(s1) '注意这里
CopyMemory ByVal VarPtr(s1), ByVal StrPtr(s), L
Debug.Print s1.name
Debug.Print s1.count
Debug.Print s1.rtn_ind
Debug.Print s1.app_seq

End Sub

[解决办法]
对了,用Lenb即可解决
[解决办法]
//To rainstormmaster(暴风雨 v2.0) ,应该怎样定义?

把字串定义成byte数组,但这样一来.处理起来就麻烦一些了,就你的问题而言,根本就不用定义结构体,用vb提供的mid函数就行了
[解决办法]
用mid怎么是一个一个取了?

比如 username=mid(str,25,30) 就可以了取到姓名了

或者你一定要用CopyMemory和MoveMemory 那先把str 转换 如下:
str = StrConv(str, vbFromUnicode)
MoveMemory ByVal VarPtr(Pack_Rsp), ByVal StrPtr(Str), bytesTotal
bytestotal=strconv(bytestotal,vbunicode)

热点排行