UTF-16是一个双字节字符编码.交换两个字节的地址将产生UTF-16BE和UTF-16LE.
但我发现命名的UTF-16编码存在于Ubuntu"gedit"文本编辑器中,以及UTF-16BE和UTF-16LE.使用C测试程序,我发现我的计算机是小端,并且UTF-16被确认为UTF-16LE的相同编码.
另外:在小/大端计算机中有两个字节顺序的值(例如整数).小端计算机将在硬件中产生很少的字节序值(除了Java生成的值,它总是形成一个大端).
虽然文本可以在我的小端计算机中保存为UTF-16LE和UTF-16BE,但字符是一个字节一个字节生成的(例如ASCII字符串,对[3]的引用和刚刚定义的UTF-16的字节顺序)由人类 - 不是因为大端机器写大端UTF-16而小端机写小端UTF-16的现象?
[1] http://www.ibm.com/developerworks/aix/library/au-endianc/
[2] http://teaching.idallen.com/cst8281/10w/notes/110_byte_order_endian.html
[3] ASCII字符串和字节序
[4] 字节顺序只影响数字的内存布局,而不影响字符串吗?这是一个字符串和机器的字节顺序之间的关系.
我有以下基本问题:
何时我们应该在调试中涉及反汇编
如何解释反汇编,例如下面每个段代表什么
00637CE3 8B 55 08 mov edx,dword ptr [arItem]
00637CE6 52 push edx
00637CE7 6A 00 push 0
00637CE9 8B 45 EC mov eax,dword ptr [result]
00637CEC 50 push eax
00637CED E8 3E E3 FF FF call getRequiredFields (00636030)
00637CF2 83 C4 0C add
Run Code Online (Sandbox Code Playgroud)
语言:C++
平台:Windows
我正在尝试编写服务器,它将与任何可以建立套接字连接的标准客户端进行通信(例如telnet客户端)
它最初是一个echo服务器,当然不需要担心网络字节排序.
我熟悉ntohs,ntohl,htons,htonl函数.如果我传输的是16位或32位的整数,或者发送的字符串中的字符是2或4字节的倍数,那么它们本身就很棒.
我想创建一个对字符串进行操作的函数,例如:
str_ntoh(char* net_str, char* host_str, int len)
{
uint32_t* netp, hostp;
netp = (uint32_t*)&net_str;
for(i=0; i < len/4; i++){
hostp[i] = ntoh(netp[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
或类似的东西.上面的假设是单词大小为32位.我们不能确定发送机器上的字数不是16位还是64位正确?
对于客户端程序,例如telnet,它们必须在发送之前使用hton*,在接收数据后使用ntoh*,对吗?
编辑:对于那些人,因为1-char是一个字节,字节序无关紧要:
int main(void)
{
uint32_t a = 0x01020304;
char* c = (char*)&a;
printf("%x %x %x %x\n", c[0], c[1], c[2], c[3]);
}
Run Code Online (Sandbox Code Playgroud)
运行此代码段.我的输出如下:
$ ./a.out
4 3 2 1
Run Code Online (Sandbox Code Playgroud)
那些关于powerPC芯片组的人应该得到'1 2 3 4'但我们这些关于intel芯片组的人应该看看我上面得到的东西.
c ×2
endianness ×2
c++ ×1
debugging ×1
disassembly ×1
portability ×1
string ×1
unicode ×1
utf-16 ×1