duangsuse::Echo
413 subscribers
3.85K photos
105 videos
574 files
5.15K links
duangsuse技术相干订阅
这是 @duangsuse 与技术有关的发布频道
duangsuse 的另外有 throws 闲杂频道
@dsuset
转载频道 @dsusep
duangsuse 有coding,github,gitlab帐号和bilibili帐号

极小可能会有批评zf的消息 如有不适可以退出

suse的小站:https://piped.stream
ps 另有别名 popf.rip
ʕ•̀ω•́ʔ✧ 🐶🍎🏠生死🐜
(>ω<)岂因祸福避趋之 一鿕
Download Telegram
duangsuse::Echo
#Math #music 最近知道了两个之前不知道的芝士: 🤔 + 音高是什么! + x 的 (n 的倒数次方)等于开 x 的 n 次方根 where n 的倒数: 1 / n x 的 k 次方: x {* x} repeats for (k-1) times n 的 k 次方根: (x 的 k 次方 = n) => x + 数学函数和数学操作符是不一样的
#tech #daily #Java #JavaScript #dev

🐱 duangsuse 的学习日常 ⭐️

+ 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs

+ 程序设计语言类型::这些名词,你知道吗?(涉及 Parameteric Polymorphism 和 Empty Types(aka. Bottom types)、Product types、Subtyping 等内容)

+ 高性能计算::C 语言和高性能计算、x86 汇编和 SIMD(单指令多数据)运算、JNI 外置原生算法

+ 软件架构::FFMpeg av* 库水印程序

+ 数据库::关系代数 #db

+ {Android, 数据结构和算法}::Android 的离散数组 SparseArray 和 ArrayMap #algorithm

+ 数据结构和算法::这些算法和数据结构,忘记了吗?

+ Rust/数据结构和算法::Rust 的 Vector 实现
+ Rust::Hole 类型、snappy 绑定、Tree 类型、LinkedList、Box、Rc、std::thread 等

+ Java 的二进制流读写器 #bin
+ Java 的 Android android.content.SharedPreferences 代理库 Prefer
+ {软件架构, Android}::编写一个 Android 上的 Service!(感谢 @YuutaW 提供学习资源,ShutdownService 默写)
+ 软件项目管理::Gradle 的抽象总结

+ JavaScript ES6: sm.ms.js
+ JavaScript ES6: 基于 CheerIO 和 Requests.js-promise-native 的爬虫,默写(感谢 @ice1000 的原实现,这可能是冰封哥有史以来最奇怪的代码,因为他写了两个完全可以被替换为更有意义结构的没有用的控制结构...)
+ JavaScript ES6: ArrayBuffer, DataView 读 BMP、再看 ASCII 艺术画生成

+ Kotlin::简单的 Realm ORM + RecyclerView Android 应用
+ Kotlin::Shell execute
+ Kotlin::Coroutine
+ Kotlin::Kotlin Native 和 Kotlin JavaScript 与 Gradle/Groovy
+ Kotlin HTML DSL
+ Kotlin 内部代理类 (Delegates)
+ Kotlin OkHttp 同步/异步封装

+ C 程序设计语言::libBMP 和 libWAV
+ C 程序设计语言::OpenGL 体验

+ 无脑模式::线性代数::高斯·约当消元法(Gauss Jordan)解齐次线性方程组(Homogenuous Linear Equation Group)
+ 无脑模式::C++/Qt::拼音分词、英文音标转换和 TTS 合成
+ 无脑模式::Haskell 抄写 Haskell 的 AlgorithmW Hindley-Milner Type system type infer algorithm 实现

+ Javax Servlet 架构体验 🤔
duangsuse::Echo
#tech #daily #Java #JavaScript #dev 🐱 duangsuse 的学习日常 ⭐️ + 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs + 程序设计语言类型::这些名词,你知道吗?(涉及 Parameteric Polymorphism 和 Empty Types(aka. Bottom types)、Product types、Subtyping 等内容) + 高性能计算::C 语言和高性能计算、x86…
这次就有一些我最想先弄的东西:

+ 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs

+ 程序设计语言类型::常见名词

+ 数据库::关系代数 #db

+ Java 的二进制流读写器 #bin

+ Java 的 Android android.content.SharedPreferences 代理库 Prefer
+ {软件架构, Android}::编写 Android ShutdownService
+ Kotlin::简单的 Realm ORM + RecyclerView Android 应用

+ JavaScript ES6: sm.ms.js
+ Kotlin::Shell execute
+ Kotlin OkHttp 同步/异步封装
Radare2 是最好的二进制编辑器 #bin
https://t.me/drakeets/1650 #bin #Telegram

啊,Telegram 最近支持的 Channel Preview 功能使得我不需要什么『内奸』帐号就可以 preview 某 Channel 的内容了
突然想解释一下这个,因为也比较简单嘛。

二进制计数法是一种位置计数法,它用于在机器中存储一定范围的数字(数位计数法)
因为其和数字电路的优异对应性,被广泛采用于现代电子计算机内。

保存整数值,其核心就是记录状态,把状态『编号』对应上数值。
10 进制里,一个数位有 10 种状态;10 位累积起来组合就有 10^{10} — 100 种,换到二进制里也是一样。

二进制无法和日常生活使用的十进制直接对应,但是可以和 16 进制以 4 bit <=> 0x0~0xF (4 位二进制对应 1 位十六进制)为单元直接对应

具体的二进制机器数运算比较复杂,这里不讨论(一部分是通过高层不可见的移位器、乘法器做到的,但算法抽象也是存在的)

0xF,15,如果不能保存 sign (符号)的话是 4 个 『二进制位』(bit)组合的极限了。
0xFF (255) 则是 8 bits 储存状态的极限了

0xFFFF_FFFF 数一下有几个 F: 8 个,就是说,对应 8*4=32 位的二进制数值

那么为什么不能?我们知道 Kotlin 是安全的,安全有时候也意味着应该尽可能避免溢出(overflow)整数值。
计算机是基础数学的实践,当然应该首先为性能考虑 — 不要想直接让处理器 ALU(Arithematic Logic Unit) 实现无限长度精度的数值,太慢了。

那 4 bits 最大能储存到 0xF 个状态(以二元状态混合叠加成 N 元状态就是我们计数的方式,0x1_0 = 2×2×2×2 = 16)可是到了这个地步,满了,记不下数了怎么办?
回滚(rollback)到最小值或者溢出(overflow),这是很多机器给出的方式,当然也有程序员自己考虑溢出情况的方式 (比如 GCC 的 __builtin_sadd_overflow

— 所以为什么,不能 (0xFFFF_FFFF as Int)

看到这个数的时候,可能觉得它反射了底层二进制存储的状况吧(其实也未必尽然,只是抽象层次不同而已,比如还存在有 byte order 的情况)。
其实还差一点:这只是语言对于 literate integer 字面量(当然是常量)的表示语法糖而已,它缺了一点:数值的表示方式,是有符号(signed)还是无符号(unsigned)

Kotlin multiplatfrom 里是有 kotlin.UInt 无符号 32-bit integer 的,这种类型是包含 0xFFFF_FFFF 这个值的

可问题在于,kotlin.Int 是要有一位来记录数值符号的,这导致 32-bit 的状态叠加得留一位,来给余下的 31 位指定其符号是正 (+) 是负 (-)

对应到 LLVM 里,i1 类型就只有符号部分 (+) (-),它只有两个状态,所以被当作同样二态的 boolean 用,i1 的真值只能是 +0 或者 -0

结果,0xFFFF_FFFF 实际上就溢出了,因为表示它至少需要 32 个二进制位,而 kotlin.Int 只能表示 31 位的正/负数而已。
32-bit 最大值 2^{32} 是 4294967296 — 16 进制 0x100000000

试试把这个值的 succ (后继数)转换到 kotlin.Int: (0x100000000+1) as Int, 你会得到

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

而真正的 Integer.MAX_VALUE 是 2^{32}-1 (去掉一个 "0" 状态) 0x7F_FF_FF_FF (2147483647)

数值类型宽度自动提升(widen),或者如果你写成常量的形式进行常量折叠(constant folding),Kotlin 编译器,已经自动选择了 Long 64-bit 的数值类型来表示溢出的数值了。

— 所以为什么 Java 里就可以?魔法 Java

因为 Java 支持数值类型可以随便溢出啊,应该说是被自动推导得比较有风格吧。至少在语义上是对的,No implicit conversations、representable using 32-bits。你 explicit 地声明它是 int 的,你为溢出负责。

class Wrong32Bit {
public static void main(String... args) {
int x = (int) 0xFF_FF_FF_FF;
System.out.println(x);
}
}

你会得到一个 (-1)
Kotlin 里就是 type error
struct,json,yaml,pickle,marshal 等序列化便利库我都用过,无非就是流 dump/load 和便利性 dumps/loads #Python #backend #bin

对于二进制读写的数值读写、字节序解释我也清楚的很, Kotlin Dokuss 和 SomeAxml(挂名) 项目都包含了基本二进制流和读写抽象

序列化(serialize)的用途一般是以二进制表示某种数据, marshal 和 pickle 虽然都是对象序列化,显然 marshal(封送) 更广义、更内部, C# 里也有这个名词,用于在进程间传递数据对象的深拷贝,也类似 android.os.Parcel
#statement #recommend #bin #net #freedom #China #recommend #learn #dalao 经典语录回顾。

——最适合这个民族的其实是一群小白围着大大转,大大通过小白的夸奖获得自我满足,然后小白的吃喝拉撒都包给大大解决的模式。
通过这个项目我感觉我已经彻底认识到这个民族的前面为什么会有一堵墙了。没有墙哪来的大大。所以到处都是什么附件回帖可见,等级多少用户组可见,一个论坛一个大大供小白跪舔,不需要政府造墙,网民也会自发造墙。这尼玛连做个翻墙软件都要造墙,真是令人叹为观止。

这是一个造了几千年墙的保守的农耕民族,缺乏对别人的基本尊重,不愿意分享,喜欢遮遮掩掩,喜欢小圈子抱团,大概这些传统是改不掉了吧。

现在维护这些项目已经越来越让我感到无趣。我还是努力工作,好好养家,早日肉翻吧。
https://t.me/c/1076357496/1975382 #sysadmin #bin 路由器 编程器(串行开发 用语) 😂
👆转:我记得最早知道这个事情是flv.js的维护者在v2还是哪里吐槽然后众人发现作者工资低的可怜😃 #bin

#sb #bilibili 作为回形针的同道我觉得,即便回形针有纰漏,这人也真是离谱,还信仰。

辛苦你🐴!!定你🐴🍺性!法律需要定性再执行??!几百粉怎么了? 不比这个让人80万,哦不160万等半个月没拿1千执行款的无亲家庭强?你辛苦你🤌

你用你🤷‍♂的信仰4天做4视频? 哦这就是“知识区up”的追求啊,高产似那啥,那啥是🐷脑啊;你的科学信仰就🤷‍♂的是负数,靠吃回形针文革热度上位,我太阳,早点揣错圣意趋势吧

我要是每期视频就3分10分钟,凭你那个动画曲线都调不利索的B ppt技术,还牛逼得这么口若悬河,我当场去世;回形针的web前端都比你懂PPT
https://github.com/wkgcass/Latte-lang#%E4%B8%AD%E6%96%87%E7%89%88-chinese-version-readme #recommend #plt #jvm Latte ,记住了. Java6 的class编译实现

zig,red; scala.js RustPython moonscript nelua jsweet java2script
https://zserge.com/posts/jvm/ 这个是 #go #bin 实现读classfile常量池&栈执行
https://github.com/axkr/symja_android_library #math #android #tool 符号代数/绘图工具
https://github.com/JacksonTian/stone-lang/tree/master/src/chap12 适合小白读物配套(确信
https://github.com/enso-org/enso 图形编程,可视化, enso.org
https://vlang.io/ 类Go C目标语言,默认no-mut,支持内部序列化. 作者貌似做了C的双向翻译
https://github.com/lclang/LittleCat 用法不错,支持闭包
https://github.com/tern-lang/tern 含游戏示例. 文档太细节
livescript.net 含IDE插件示例
https://github.com/tonysparks/leola 支持协程, namespace: 是啥鬼

https://github.com/cqfn/eo 奇奇怪怪的XML语言.. jolie-lang.org 奇奇怪怪的 Swagger??


https://www.zhihu.com/question/27831730 RednaxelaFX大在这里手撕 #java 编译与反编译器,🐮
你R大永远是你R大🤪

https://www.zhihu.com/question/39400401 还是R大谈CLR-JVM=真泛型&in-out,delegate,P/Invoke&unsigned&Valtype,unsafe和受检溢出,无classloader 树 ,其他人就知道tailrec和jit,gc这些还说混了

不愧是R大 真不是盖的
一己之力拉高 #zhihu 编译原理水平
MAT / IFW 禁用方案分享:
导致星巴克崩溃无报错的S服务
此服务似乎来自梆梆安全加固企业版 com.secneo.apkwrapper.r.S
胡乱分析了一下,这个 S 服务会访问 int com.secneo.apkwrapper.H.o(Context) 静态方法,这个静态本地方法,当本地库返回值小于等于 0 时会直接调用 System.exit(0); 所以也没有错误日志出现。
本地库为 libDexHelper.so / libDexHelper-x86.so

#reveng 🌚为了帮助大佬(如 GetDex)们秀memdump和art插件等 #aop 基本操作啊

>我一直想加固到底有什么用呢?
它不也是防君子不防小人的东西吗?甚至于所有字节码如果想让系统运行的话,那系统一定要可以识别这个字节码。
那如果一个系统本身在加载字节码的地方提取了一份,当搜索已加载代码中的引用,来不停的请求 loadClass 之类,那么加固外壳的解密功能完全不可能拒绝系统的这种请求。最终依然会被探索出被加密代码的解密字节码(


稍微有点 #bin#assembly 常识也不会相信这些吧,难道不是不理解struct才相信二进制和mem不可读?
掌握程序=听天由命,掌握解释=掌控程序 🌚

我对IT交流的科普力是失望的,代码写得🌸时非常开心,一谈到低层抽象都有武德了,就会用个序列化/反编译工具;当初万能汇编器的时代去哪了
#algor #rust #bin The Smallest Hash Table (Score: 150+ in 13 hours)
fn phf_shift(x: u32) -> u8
可用于HashMap

Link: https://readhacker.news/s/5zwK4
Comments: https://readhacker.news/c/5zwK4
duangsuse::Echo
#py 周刊 - Excel 支持 import pandas, statsmodels, matplotlib / seaborn 了, Guido 亲自推广(可能是云计算,要订阅) - PowerToys添加“可交互”的截图 - Google 等各种大公司的技术blog #list - #apple #design 设计师法则 - #learn 看美军的脏话官话(F-words)学英语 。 - 单靠 #sql 如何保存数据 - APL 里有的 py 基本列表处理式 - FastAPI 最佳实践 list…
#py 周刊
HackerNews 等新闻聚合
本该辅助思维的工具,如何异化我们
pysentation: 在终端展示你的py代码
js anti-debug: 尝试阻止全编程界最优秀的 DevTools,
https://github.com/theajack/disable-devtool/blob/master/src/detector/sub-detector/func-to-string.ts
v0.dev: 生成预览和迭代HTML设计

Mojo 🔥 Linux版本可用, 自带 Tensor(nd),DType 支持
(ps. 这人怎么 parser 都不会写啊, (1+ 换行 1) 时解析失败,等待下一行不就行了吗? 他只是写了个众所周知的hint
这个 let var 是干嘛啊(还有Java式的 class Benchmark..),Python 简洁的优势都丢了

🤖 Falcon 作为当前最大的开源大模型,有 180B 参数,在 3.5 万亿词的 TII RefinedWeb 上训练
jieba的替换: pkuseg-python , hanlp

#wasm #plt 500行迷你C编译器
🥧 半手工绘制 plt.极座标直方图

📈 #algorithm min/maxHeap 有序列实现
#bin Bloom filter 集合 位运算实现 —性质类似WeakSet, 非常快

🐳 用Podman部署py包 [维护pip包]
📝 使用 Protobuf message{} 储存和传输
protoc --python_out=. .\music.proto

from music_pb2 import Library
Library().add(music).K=V
lib.SerializeToString()
lib.ParseFromString(f.read())


compress:基于个人语料库的快捷输入工具
gpt_academic #zh gui : 为 ChatGPT/GLM 提供实用化交互界面
GPT 学术优化,特别优化论文阅读/润色/写作体验,模块化设计,支持自定义快捷按钮&函数插件,支持 Python 和 C++ 等项目剖析&自译解功能,PDF/LaTex 论文翻译&总结功能
#bin 仅仅是load一个 bytes[lenPrefix] 有啥好库推荐?
struct 和 cffi 都太垃圾了。我让AI用mmap解指针,
ffi.cast("header_t *", mm[:ffi.sizeof("header_t")])
ffi.unpack(ffi.cast("char *", mm + key_offset), keylen)
毫无数组结构给我干懵了

SO上有一个非常幽默的
(i,), data = struct.unpack("I", data[:4]), data[4:]
s, data = data[:i], data[i:]
还提了个helper,但只能兼容尾部数组,连流解析都没有

from construct import *
format = Struct(
"signature" / Const(b"BMP"),
"width" / Int8ub,
"height" / Int8ub,
"pixels" / Array(this.width * this.height, Byte),
)
format.build(dict(width=3,height=2,pixels=[7,8,9,11,12,13]))
format.parse(b'BMP\x03\x02\x07\x08\t\x0b\x0c\r')

可以流 https://construct.readthedocs.io/en/latest/
感觉比protoc编译好

Web ArrayBuffer 也是支持的,包括 array('B') 和一些有趣的社区库
mm = np.memmap(filename, np.int16, 'r', shape=(1000, 64))
import binaryfile
import deconstruct as c

class InputEvent(c.Struct):
time: c.uint64[2]
value: c.int32

# Define the file structure&read()
def file_spec(f):
size = f.count('size', 'text', 2) # A two-byte unsigned integer
f.bytes('text', size)


pickle,marshal就不说了,和JDK OOStream 一样不规范到需要内定的程度(还不如巨硬的COM呢..)
而且还破坏了 load/dump 的弱类型接口
https://github.com/cunarist/rinf
https://www.visioncortex.org/vtracer/
由螃蟹驱动的位图描边转矢量工具 #tool svg

https://www.lummi.ai/
https://github.com/adobe-webplatform/shaderdsl

有趣
有趣
http://topcoat.io
搞点传统的 #css
https://github.com/Web-Media-Foundation/infrastructure/blob/master/packages/ogg-polyfill/src/OggVorbisPage.ts #js #bin

隔壁实现完了 Vorbis 的解码前端(只带解编码元信息,不带解成 PCM 的部分),八百多行

https://t.me/im_RORIRI/17034
#statement
其实也不难,只要你知道你程序依赖的领域、最小的功能是啥,解决问题必须先确定范围;知道自己在干什么、与旧案有何区别、又为何不同,才配叫工程。

比如二进制吧,像bmp那样用一个struct就能parse的东西很少,因为C拿指针掩盖了带长数组、也无常量池等规范,但继续用 u/int32_t 那样的概念也没意义,不如叫 +-1 2 4 8 吧。甚至C bitfield也应该拿bitflags换了。
凡是用不到的专业概念,比如bitsize,全部抛弃掉,这样才有机会
避开前人留的坑

除了 read(bView, ['*', [4 4,'Num2 x y']]) 这样的带长数组,struct的json化也可以基于Proxy,以实现0copy序列化、push、sort啥的

总之就是确定最小问题是什么,然后组合、复用、降低复杂度来换算法的高效能
#py #js #bin
不过你的下一个项目可以用 fitUint(nBit, obj,key){if o[k]undef or isF5:read else write} 这样的读取模式

能read,能解码,但是不能编码,听起来有点奇怪。 printf/scanf 都不是这样的

你明明知道一个struct的结构,能够免费实现load(),却无法修改保存你读到的东西,这不奇怪吗?

好吧,对工程界这是基本操作。Reader/Writer嘛
因为一般,人们只是把bin搞成JSON,而不会反过来,二进制都是旧程序员输出的东西了

struct datefld {unsigned short day : 5, month : 4, year : 14; };
https://en.cppreference.com/w/cpp/language/bit_field

那有没有可能按buffer读,但是对unaligned read,换bitfield(64)?
这样手写let x=readU8() ret{x} 的样板代码也会减少

py就有一个 cStruct
format = Struct(
"signature" / Const(b"BMP"),
"width" / Int8ub,
"height" / Int8ub,
"pixels" / Array(this.width * this.height, Byte),
)
https://construct.readthedocs.io/en/latest/intro.html#example

d = Bitwise(Struct(
Padding(2),
"x" / Flag,
Padding(5),
))
d.build(dict(x=5))
b' '
https://construct.readthedocs.io/en/latest/bitwise.html#bitstruct

ffmpeg那样开源又sota的系统工具太少了

我觉得jspy这些的API没做错,py这封装不是很完备么?只是习惯于类比文本和二进制的dev太少了,都是被迫在写

Hz写过ASN.1吗听说很快 还支持惰性XML

这玩意的stdint好像还是msdos的命名风格,真的直接按byte数定义binfmt不好么

其实穷人用 https://apps.kde.org/zh-cn/okteta/ 也行
还是Qt那帮人聪明,堪比ms
duangsuse::Echo
补一句,为什么我那么在乎readXX() 首先,当然是它余缀了,Reader模式、Visitor模式需要加固定前缀是哪群大师教的?? Qt,luaY_parse 都没有这种文明 至少对 enum Op{Add(Op,Op); N(i32)} 写 visitAdd 的人绝对是py ast看多了,overloads不会用。 Java比C最主要的优势就是Type2namespace,居然有人主动添加余缀? 然后,是对编程界毫无进步的无奈。 我最初学编程时(8,9年前吧)改了一些c#小游戏,当时有 https…
duangsuse: #读写线 #bin #FP #algorithm
1.所以我认为这种partial是错的,比如lexer吧,至少把Node的wsPre 保留下来-比如对注释文档,这样rust fmt/doc也会好写很多。

2.你举得例子太tricky了,而且JSON就不是一种minimal dynKV- 它有一大堆无效的;, 需要过滤

3.内存buf问题应该交给linux swap处理,而且用 fit(inoutT参数) 替代read():T 并不会阻止windowing

4.所以只要在pull的回调里注册onmut,就能免费定义出writeback(),当然实践起来确实没那么简单

duangsuse:
冷知识: int** 可以被scanf读取

C是存在静态数组的,i=0..sizeof a/sizeof int
https://blog.csdn.net/GGN_2015/article/details/119902369

我们可以确定一个共识: readXX() 的本质,是通过ret和赋值stack var把file的一部分加载到mem的KV乃至于[]里,这也是为何libc的tcp和inode都是 iostream API --以及为何会jspy的人不懂C移植

因此,虽然它叫IO,却被框在call-return并赋值、 forEach-call并write 的枷锁里,明明只是asn.1那样的databind手段,却被递归下降的样板代码给框住了

但这种模式在C里,就是struct,set_type和set_size的递归下降,可以靠os的vm功能缓存、1次读完 mmap():bytes,当然任何新语言都没有直观对应出这个

如果有些struct var 是不需要读的,完全可以用 isDbg: 来mock自己读到了,然后不实际赋值,反正JS是动态的

对了,你觉得为啥js版bytes(blob,abuf) 都不提供流API

难道它是想让用户手写py structs那样的封装?

py有cString,jvm有Reader,js没有byte流接口;那就是只想read一个二进制header喽?

TextDecoder那个啊,感觉java味大
尤其是async*() ,不得不用State(var)取代吧

https://developer.mozilla.org/en-US/docs/Web/API/Streams_API

最大的功能就是补丁fetch()和onrequest ,其他和WebSocket重叠了

duangsuse:
额。。就是讲用回调的人为何被coro不明觉厉到了,呗

Object的本质就是可扩展的fn.bind()
打包好避免难传递

用回调的人根本没有错,错就错在coro.then为什么那么间接,还没人解读

不同的OOP还是有区别的,虽然大家的实质都是在提供参数N->1和if typeof 这些CLOS都懂的函数式风格的技术

但Java对closureArg 样板化的支持(通过重写和重载)更好,这也是为什么MBPC classdef比lisp的defclass有意义
往大了说语法差异都是没有意义的,无非就是alloca和malloc、递归下降、流水线这些算法嘛

另外,这还有个魔怔的中英emoji双语嵌入式编程支持原型链 def T.class(vars):ret{}

https://gitee.com/chen-chaochen/lpk#https://gitee.com/link?target=https%3A%2F%2Flosu.tech%2Fplayground
https://www.ruanyifeng.com/blog/2016/11/byte-order.html #meme #bin

Berkeley套接字定义了一组转换函数,用于16和32位整数在网络序和本机字节序之间的转换。htonl,htons用于本机序转换到网络序;ntohl,ntohs用于网络序转换到本机序。
https://gist.github.com/fffaraz/9d9170b57791c28ccda9255b48315168#file-dns-c-L123-L132

小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
大端模式 :符号位的判定固定为第一个字节,容易判断正负。

小端模式更适合系统内部,大端模式更适合网络数据传递,加上一些历史引领的原因,
导致现在两种字节序方式并存。

>算加减乘除要从LSB到MSB进位。如果先把小位算完了再算大位,直接把carry out加到大位里就可以了,这个在8位CPU上尤其重要
>“程序中不应该出现大小字节序的问题,只有‘网络字节序’和‘本机字节序’。应该使用ntohl,ntohs,htonl,htons进行转换"。我很受用,感觉一下子就掌握到了问题的本质,即在什么地方需要注意什么问题。